Full Code of notgiven688/jitterphysics2 for AI

main 737b150eb1f6 cached
383 files
6.2 MB
1.6M tokens
4233 symbols
1 requests
Download .txt
Showing preview only (6,560K chars total). Download the full file or copy to clipboard to get everything.
Repository: notgiven688/jitterphysics2
Branch: main
Commit: 737b150eb1f6
Files: 383
Total size: 6.2 MB

Directory structure:
gitextract_pvwrcex8/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── issue.md
│   └── workflows/
│       ├── build-demo.yml
│       ├── deploy-docs.yml
│       ├── deterministic-hash.yml
│       ├── jitter-tests.yml
│       ├── publish.yml
│       └── test-deploy-docs.yml
├── LICENSE
├── README.md
├── docfx/
│   ├── .gitignore
│   ├── AppBundle/
│   │   ├── WebDemo.runtimeconfig.json
│   │   ├── _framework/
│   │   │   ├── Jitter2.wasm
│   │   │   ├── Raylib-cs.wasm
│   │   │   ├── System.Collections.wasm
│   │   │   ├── System.Private.CoreLib.wasm
│   │   │   ├── System.Runtime.InteropServices.JavaScript.wasm
│   │   │   ├── WebDemo.wasm
│   │   │   ├── blazor.boot.json
│   │   │   ├── dotnet.js
│   │   │   ├── dotnet.native.js
│   │   │   ├── dotnet.native.wasm
│   │   │   ├── dotnet.runtime.js
│   │   │   └── supportFiles/
│   │   │       ├── 0_JetBrainsMono-LICENSE.txt
│   │   │       ├── 2_lighting.fs
│   │   │       └── 3_lighting.vs
│   │   ├── index.html
│   │   ├── main.js
│   │   └── package.json
│   ├── docfx.json
│   ├── docs/
│   │   ├── changelog.md
│   │   ├── documentation/
│   │   │   ├── arbiters.md
│   │   │   ├── bodies.md
│   │   │   ├── constraints.md
│   │   │   ├── dynamictree.md
│   │   │   ├── filters.md
│   │   │   ├── general.md
│   │   │   ├── images/
│   │   │   │   └── dynamictree.odp
│   │   │   ├── shapes.md
│   │   │   └── world.md
│   │   ├── introduction.md
│   │   ├── toc.yml
│   │   └── tutorials/
│   │       ├── boxes/
│   │       │   ├── hello-world.md
│   │       │   ├── project-setup.md
│   │       │   └── render-loop.md
│   │       └── teapots/
│   │           ├── aftermath.md
│   │           ├── hello-world.md
│   │           ├── hull-sampling.md
│   │           └── project-setup.md
│   ├── index.md
│   ├── run.sh
│   ├── template/
│   │   └── public/
│   │       └── main.js
│   └── toc.yml
├── other/
│   ├── ContactClipping/
│   │   ├── ClipDebug.cs
│   │   ├── JitterClipVisualizer.csproj
│   │   └── Program.cs
│   ├── GodotDemo/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── JitterGodot.csproj
│   │   ├── JitterGodot.sln
│   │   ├── Program.cs
│   │   ├── README.md
│   │   ├── assets/
│   │   │   ├── box.png.import
│   │   │   └── floor.png.import
│   │   ├── box.material
│   │   ├── icon.svg.import
│   │   ├── main_scene.tscn
│   │   └── project.godot
│   ├── GodotSoftBodies/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── JitterGodot.csproj
│   │   ├── JitterGodot.sln
│   │   ├── Program.cs
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── texture_08.png.import
│   │   ├── box.material
│   │   ├── icon.svg.import
│   │   ├── main_scene.tscn
│   │   └── project.godot
│   └── WebDemo/
│       ├── LICENSE
│       ├── Program.cs
│       ├── Properties/
│       │   ├── AssemblyInfo.cs
│       │   └── launchSettings.json
│       ├── README.md
│       ├── RLights.cs
│       ├── WebDemo.csproj
│       ├── assets/
│       │   ├── JetBrainsMono-LICENSE.txt
│       │   ├── lighting.fs
│       │   └── lighting.vs
│       ├── index.html
│       ├── main.js
│       ├── run
│       ├── runtimeconfig.template.json
│       └── runtimes/
│           └── raylib.a
├── src/
│   ├── .gitignore
│   ├── Jitter2/
│   │   ├── Attributes.cs
│   │   ├── Collision/
│   │   │   ├── CollisionFilter/
│   │   │   │   ├── IBroadPhaseFilter.cs
│   │   │   │   ├── INarrowPhaseFilter.cs
│   │   │   │   └── TriangleEdgeCollisionFilter.cs
│   │   │   ├── CollisionIsland.cs
│   │   │   ├── DynamicTree/
│   │   │   │   ├── DynamicTree.FindNearest.cs
│   │   │   │   ├── DynamicTree.RayCast.cs
│   │   │   │   ├── DynamicTree.SweepCast.cs
│   │   │   │   ├── DynamicTree.cs
│   │   │   │   ├── IDynamicTreeProxy.cs
│   │   │   │   └── TreeBox.cs
│   │   │   ├── IslandHelper.cs
│   │   │   ├── NarrowPhase/
│   │   │   │   ├── CollisionManifold.cs
│   │   │   │   ├── ConvexPolytope.cs
│   │   │   │   ├── ISupportMappable.cs
│   │   │   │   ├── MinkowskiDifference.cs
│   │   │   │   ├── NarrowPhase.cs
│   │   │   │   ├── SimplexSolver.cs
│   │   │   │   ├── SimplexSolverAB.cs
│   │   │   │   └── SupportPrimitives.cs
│   │   │   ├── PairHashSet.cs
│   │   │   └── Shapes/
│   │   │       ├── BoxShape.cs
│   │   │       ├── CapsuleShape.cs
│   │   │       ├── ConeShape.cs
│   │   │       ├── ConvexHullShape.cs
│   │   │       ├── CylinderShape.cs
│   │   │       ├── ICloneableShape.cs
│   │   │       ├── PointCloudShape.cs
│   │   │       ├── RigidBodyShape.cs
│   │   │       ├── Shape.cs
│   │   │       ├── ShapeHelper.cs
│   │   │       ├── SphereShape.cs
│   │   │       ├── TransformedShape.cs
│   │   │       ├── TriangleMesh.cs
│   │   │       ├── TriangleShape.cs
│   │   │       └── VertexSupportMap.cs
│   │   ├── DataStructures/
│   │   │   ├── ISink.cs
│   │   │   ├── PartitionedSet.cs
│   │   │   ├── ReadOnlyHashset.cs
│   │   │   ├── ReadOnlyList.cs
│   │   │   ├── ShardedDictionary.cs
│   │   │   ├── SlimBag.cs
│   │   │   └── SpanHelper.cs
│   │   ├── Dynamics/
│   │   │   ├── Arbiter.cs
│   │   │   ├── Constraints/
│   │   │   │   ├── AngularMotor.cs
│   │   │   │   ├── BallSocket.cs
│   │   │   │   ├── ConeLimit.cs
│   │   │   │   ├── Constraint.cs
│   │   │   │   ├── DistanceLimit.cs
│   │   │   │   ├── FixedAngle.cs
│   │   │   │   ├── HingeAngle.cs
│   │   │   │   ├── Internal/
│   │   │   │   │   └── QMatrix.cs
│   │   │   │   ├── Limit.cs
│   │   │   │   ├── LinearMotor.cs
│   │   │   │   ├── PointOnLine.cs
│   │   │   │   ├── PointOnPlane.cs
│   │   │   │   └── TwistAngle.cs
│   │   │   ├── Contact.cs
│   │   │   ├── Joints/
│   │   │   │   ├── HingeJoint.cs
│   │   │   │   ├── Joint.cs
│   │   │   │   ├── PrismaticJoint.cs
│   │   │   │   ├── UniversalJoint.cs
│   │   │   │   └── WeldJoint.cs
│   │   │   └── RigidBody.cs
│   │   ├── IDebugDrawer.cs
│   │   ├── Jitter2.csproj
│   │   ├── LinearMath/
│   │   │   ├── Interop.cs
│   │   │   ├── JAngle.cs
│   │   │   ├── JBoundingBox.cs
│   │   │   ├── JMatrix.cs
│   │   │   ├── JQuaternion.cs
│   │   │   ├── JTriangle.cs
│   │   │   ├── JVector.cs
│   │   │   ├── MathHelper.cs
│   │   │   └── StableMath.cs
│   │   ├── Logger.cs
│   │   ├── Parallelization/
│   │   │   ├── Parallel.cs
│   │   │   ├── ParallelExtensions.cs
│   │   │   ├── ReaderWriterLock.cs
│   │   │   └── ThreadPool.cs
│   │   ├── Precision.cs
│   │   ├── SoftBodies/
│   │   │   ├── BroadPhaseCollisionFilter.cs
│   │   │   ├── DynamicTreeCollisionFilter.cs
│   │   │   ├── SoftBody.cs
│   │   │   ├── SoftBodyShape.cs
│   │   │   ├── SoftBodyTetrahedron.cs
│   │   │   ├── SoftBodyTriangle.cs
│   │   │   └── SpringConstraint.cs
│   │   ├── Tracer.cs
│   │   ├── Unmanaged/
│   │   │   ├── MemoryHelper.cs
│   │   │   └── PartitionedBuffer.cs
│   │   ├── World.Detect.cs
│   │   ├── World.Deterministic.cs
│   │   ├── World.Step.cs
│   │   ├── World.cs
│   │   └── _package/
│   │       ├── LICENSE
│   │       ├── README.md
│   │       └── THIRD-PARTY-NOTICES.txt
│   ├── Jitter2.sln
│   ├── Jitter2.slnx
│   ├── JitterBenchmark/
│   │   ├── JitterBenchmark.csproj
│   │   ├── Program.cs
│   │   └── Usings.cs
│   ├── JitterDemo/
│   │   ├── ColorGenerator.cs
│   │   ├── Conversion.cs
│   │   ├── ConvexDecomposition.cs
│   │   ├── Demos/
│   │   │   ├── Car/
│   │   │   │   ├── ConstraintCar.cs
│   │   │   │   ├── RayCastCar.cs
│   │   │   │   └── Wheel.cs
│   │   │   ├── Common.cs
│   │   │   ├── Demo00.cs
│   │   │   ├── Demo01.cs
│   │   │   ├── Demo02.cs
│   │   │   ├── Demo03.cs
│   │   │   ├── Demo04.cs
│   │   │   ├── Demo05.cs
│   │   │   ├── Demo06.cs
│   │   │   ├── Demo07.cs
│   │   │   ├── Demo08.cs
│   │   │   ├── Demo09.cs
│   │   │   ├── Demo10.cs
│   │   │   ├── Demo11.cs
│   │   │   ├── Demo12.cs
│   │   │   ├── Demo13.cs
│   │   │   ├── Demo14.cs
│   │   │   ├── Demo15.cs
│   │   │   ├── Demo16.cs
│   │   │   ├── Demo17.cs
│   │   │   ├── Demo18.cs
│   │   │   ├── Demo19.cs
│   │   │   ├── Demo20.cs
│   │   │   ├── Demo21.cs
│   │   │   ├── Demo22.cs
│   │   │   ├── Demo23.cs
│   │   │   ├── Demo24.cs
│   │   │   ├── Demo25.cs
│   │   │   ├── Demo26.cs
│   │   │   ├── Demo27.cs
│   │   │   ├── Demo28.cs
│   │   │   ├── Demo29.cs
│   │   │   ├── Demo30.cs
│   │   │   ├── IDemo.cs
│   │   │   ├── Misc/
│   │   │   │   ├── CcdSolver.cs
│   │   │   │   ├── GearCoupling.cs
│   │   │   │   ├── Octree.cs
│   │   │   │   └── Player.cs
│   │   │   └── SoftBody/
│   │   │       ├── PressurizedSphere.cs
│   │   │       ├── SoftBodyCloth.cs
│   │   │       └── SoftBodyCube.cs
│   │   ├── JitterDemo.csproj
│   │   ├── Playground.Debug.cs
│   │   ├── Playground.Gui.cs
│   │   ├── Playground.Picking.cs
│   │   ├── Playground.cs
│   │   ├── Program.cs
│   │   ├── Renderer/
│   │   │   ├── Assets/
│   │   │   │   ├── Image.cs
│   │   │   │   └── Mesh.cs
│   │   │   ├── CSM/
│   │   │   │   ├── CSMInstance.cs
│   │   │   │   ├── CSMRenderer.cs
│   │   │   │   ├── CSMShader.cs
│   │   │   │   └── Instances/
│   │   │   │       ├── Cloth.cs
│   │   │   │       ├── Cone.cs
│   │   │   │       ├── Cube.cs
│   │   │   │       ├── Cylinder.cs
│   │   │   │       ├── DebugInstance.cs
│   │   │   │       ├── Floor.cs
│   │   │   │       ├── HalfSphere.cs
│   │   │   │       ├── MultiMesh.cs
│   │   │   │       ├── Sphere.cs
│   │   │   │       ├── TestCube.cs
│   │   │   │       ├── TriangleMesh.cs
│   │   │   │       └── Tube.cs
│   │   │   ├── Camera.cs
│   │   │   ├── DearImGui/
│   │   │   │   ├── ImGui.cs
│   │   │   │   ├── ImGuiNative.cs
│   │   │   │   └── ImGuiStructs.cs
│   │   │   ├── DebugRenderer.cs
│   │   │   ├── ImGuiRenderer.cs
│   │   │   ├── ImportResolver.cs
│   │   │   ├── OpenGL/
│   │   │   │   ├── GLDebug.cs
│   │   │   │   ├── GLDevice.cs
│   │   │   │   ├── GLFWWindow.cs
│   │   │   │   ├── Input/
│   │   │   │   │   ├── Joystick.cs
│   │   │   │   │   ├── Keyboard.cs
│   │   │   │   │   └── Mouse.cs
│   │   │   │   ├── LinearMath/
│   │   │   │   │   ├── Matrix4.cs
│   │   │   │   │   ├── MatrixHelper.cs
│   │   │   │   │   ├── Vector2.cs
│   │   │   │   │   ├── Vector3.cs
│   │   │   │   │   └── Vector4.cs
│   │   │   │   ├── Native/
│   │   │   │   │   ├── GL.cs
│   │   │   │   │   └── GLFW.cs
│   │   │   │   ├── Objects/
│   │   │   │   │   ├── ArrayBuffer.cs
│   │   │   │   │   ├── ElementArrayBuffer.cs
│   │   │   │   │   ├── Framebuffer.cs
│   │   │   │   │   ├── GLBuffer.cs
│   │   │   │   │   ├── GLObject.cs
│   │   │   │   │   ├── Shader.cs
│   │   │   │   │   ├── Texture.cs
│   │   │   │   │   └── VertexArrayObject.cs
│   │   │   │   └── Uniforms.cs
│   │   │   ├── RenderWindow.cs
│   │   │   ├── Skybox.cs
│   │   │   ├── TextureOverlay.cs
│   │   │   └── VertexDefinitions.cs
│   │   ├── assets/
│   │   │   ├── car.LICENSE
│   │   │   ├── car.blend
│   │   │   ├── car.obj
│   │   │   ├── car.tga
│   │   │   ├── dragon.LICENSE
│   │   │   ├── level.LICENSE
│   │   │   ├── level.blend
│   │   │   ├── level.obj
│   │   │   ├── logo.tga
│   │   │   ├── teapot_hull.obj
│   │   │   ├── texture_10.LICENSE
│   │   │   ├── texture_10.tga
│   │   │   ├── unit.tga
│   │   │   └── wheel.obj
│   │   └── runtimes/
│   │       ├── LICENSE
│   │       ├── linux-arm64/
│   │       │   └── native/
│   │       │       └── libglfw.so.3
│   │       └── linux-x64/
│   │           └── native/
│   │               └── libglfw.so.3
│   └── JitterTests/
│       ├── Api/
│       │   ├── BoundingBoxTests.cs
│       │   ├── DynamicTreeDistanceTests.cs
│       │   ├── InertiaTests.cs
│       │   ├── InteropTests.cs
│       │   ├── MassInertiaTests.cs
│       │   ├── MathTests.cs
│       │   ├── RayTriangle.cs
│       │   ├── RigidBodyCreationTests.cs
│       │   ├── RigidBodyPropertyTests.cs
│       │   ├── SequentialTests.cs
│       │   ├── ShapeTests.cs
│       │   ├── SupportMapTests.cs
│       │   ├── UnsafeConversion.cs
│       │   └── WorldTests.cs
│       ├── Behavior/
│       │   ├── AddRemoveTests.cs
│       │   ├── BroadPhaseUpdateTests.cs
│       │   ├── CollisionFilterTests.cs
│       │   ├── CollisionTests.cs
│       │   ├── ConstraintLifecycleTests.cs
│       │   ├── ContactLifecycleTests.cs
│       │   ├── ForceImpulseTests.cs
│       │   ├── MiscTests.cs
│       │   ├── MotionTypeTests.cs
│       │   ├── NullBodyTests.cs
│       │   ├── SleepTests.cs
│       │   ├── StackingTests.cs
│       │   └── WorldCallbackTests.cs
│       ├── Constraints/
│       │   ├── AdditionalConstraintBehaviorTests.cs
│       │   ├── ConstraintSolverOutcomeTests.cs
│       │   ├── ConstraintTests.cs
│       │   └── DeterministicConstraintSolverTests.cs
│       ├── Helper.cs
│       ├── JitterTests.csproj
│       ├── Regression/
│       │   ├── CollisionManifoldTests.cs
│       │   ├── HistoricalRegressionTests.cs
│       │   └── PersistentContactManifoldSelectionTests.cs
│       ├── Robustness/
│       │   ├── DisposedWorldTests.cs
│       │   ├── LockTests.cs
│       │   ├── MotionAndPredictionTests.cs
│       │   ├── MultiThreadRobustnessTests.cs
│       │   ├── NumericEdgeCaseTests.cs
│       │   ├── ParallelTests.cs
│       │   └── ReproducibilityTest.cs
│       └── Usings.cs
└── tools/
    ├── CoACD/
    │   ├── README
    │   ├── run.py
    │   └── run.sh
    └── ImGui.NET/
        ├── CodeGenerator/
        │   ├── CSharpCodeWriter.cs
        │   ├── CodeGenerator.csproj
        │   ├── ImguiDefinitions.cs
        │   ├── Program.cs
        │   ├── TypeInfo.cs
        │   └── definitions/
        │       ├── cimgui/
        │       │   ├── definitions.json
        │       │   ├── structs_and_enums.json
        │       │   └── variants.json
        │       ├── cimguizmo/
        │       │   ├── definitions.json
        │       │   ├── structs_and_enums.json
        │       │   └── variants.json
        │       ├── cimnodes/
        │       │   ├── definitions.json
        │       │   ├── structs_and_enums.json
        │       │   └── variants.json
        │       └── cimplot/
        │           ├── definitions.json
        │           ├── structs_and_enums.json
        │           └── variants.json
        ├── LICENSE
        ├── README
        └── cimgui/
            └── mingw-w64-x86_64.cmake

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/ISSUE_TEMPLATE/issue.md
================================================
---
name: Issue
about: Generic Jitter Issue
title: ''
labels: ''
assignees: ''

---

**Note:** For general inquiries, such as "How do I...?", please use the discussion page instead of opening issues. You can find the discussion page [here](https://github.com/notgiven688/jitterphysics2/discussions).


================================================
FILE: .github/workflows/build-demo.yml
================================================
name: Build Demo

on:
  push:
    branches: [ main ]
  pull_request:

jobs:
  build-demo:

    runs-on: ubuntu-latest

    defaults:
      run:
        working-directory: ./src/JitterDemo

    steps:
      - uses: actions/checkout@v4

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 10.0.x

      - name: Restore dependencies
        run: dotnet restore

      - name: Build
        run: dotnet build --configuration Release --no-restore


================================================
FILE: .github/workflows/deploy-docs.yml
================================================
name: Build and deploy documentation

on:
  push:
    branches:
      - main

jobs:
  deploy:
    name: Build and deploy documentation
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '9.0.x'

      - name: Install docfx
        run: dotnet tool install -g docfx

      - name: Generate API metadata
        run: docfx metadata
        working-directory: docfx

      - name: Build documentation
        run: docfx build
        working-directory: docfx

      - name: Deploy to GitHub Pages
        uses: peaceiris/actions-gh-pages@v4
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./docfx/_site
          cname: jitterphysics.com
          publish_branch: pages
          user_name: github-actions[bot]
          user_email: 41898282+github-actions[bot]@users.noreply.github.com


================================================
FILE: .github/workflows/deterministic-hash.yml
================================================
name: Deterministic Hash

on:
  push:
    branches: [ main ]
  pull_request:

jobs:
  deterministic-hash:
    name: Deterministic Hash (${{ matrix.os }}, ${{ matrix.precision }})
    runs-on: ${{ matrix.os }}

    strategy:
      fail-fast: false
      matrix:
        os:
          - ubuntu-latest
          - windows-latest
          - macos-latest
        precision:
          - single
          - double

    defaults:
      run:
        working-directory: ./src/JitterTests

    steps:
      - uses: actions/checkout@v4

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 10.0.x

      - name: Restore dependencies
        run: dotnet restore

      - name: Run deterministic hash repro (single precision)
        if: matrix.precision == 'single'
        run: dotnet test --configuration Release --no-restore --filter "FullyQualifiedName~JitterTests.Robustness.ReproducibilityTest.DeterministicScene_MatchesAcrossThreadingForTwentySeconds"

      - name: Run deterministic hash repro (double precision)
        if: matrix.precision == 'double'
        run: dotnet test --configuration Release --no-restore -p:DoublePrecision=true --filter "FullyQualifiedName~JitterTests.Robustness.ReproducibilityTest.DeterministicScene_MatchesAcrossThreadingForTwentySeconds"


================================================
FILE: .github/workflows/jitter-tests.yml
================================================
name: JitterTests

on:
  push:
    branches: [ main ]
  pull_request:

permissions:
  id-token: write
  contents: write
  checks: write
  actions: write

env:
  CONFIGURATION: Release
  TEST_RESULTS_DIR: ./TestResults

jobs:
  build-and-test:
    name: Build and Test (${{ matrix.precision }})

    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        precision:
          - single
          - double

    defaults:
      run:
        working-directory: ./src/JitterTests

    steps:
      - uses: actions/checkout@v4
      
      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 9.0.x
      
      - name: Restore dependencies
        run: dotnet restore

      - name: Build single-precision tests
        if: matrix.precision == 'single'
        run: dotnet build --configuration ${{ env.CONFIGURATION }} --no-restore

      - name: Build double-precision tests
        if: matrix.precision == 'double'
        run: dotnet build --configuration ${{ env.CONFIGURATION }} --no-restore -p:DoublePrecision=true

      - name: Run single-precision tests
        if: matrix.precision == 'single'
        run: |
          mkdir -p ${{ env.TEST_RESULTS_DIR }}

          dotnet test --configuration ${{ env.CONFIGURATION }} --no-restore \
            --test-adapter-path:. --logger "trx;LogFileName=single-precision.trx"

      - name: Run double-precision tests
        if: matrix.precision == 'double'
        run: |
          mkdir -p ${{ env.TEST_RESULTS_DIR }}

          dotnet test --configuration ${{ env.CONFIGURATION }} --no-restore -p:DoublePrecision=true \
            --test-adapter-path:. --logger "trx;LogFileName=double-precision.trx"


================================================
FILE: .github/workflows/publish.yml
================================================
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json

name: Publish NuGet
on:
  workflow_dispatch: # Allow running the workflow manually from the GitHub UI
  push:
    branches:
      - 'main'       # Run the workflow when pushing to the main branch
  pull_request:
    branches:
      - '*'          # Run the workflow for all pull requests
  release:
    types:
      - published    # Run the workflow when a new GitHub release is published

env:
  DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
  DOTNET_NOLOGO: true
  NuGetDirectory: ${{ github.workspace }}/nuget

defaults:
  run:
    shell: pwsh

jobs:
  create_nuget:

    runs-on: ubuntu-latest

    defaults:
      run:
        working-directory: ./src/Jitter2

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0 # Get all history to allow automatic versioning using MinVer

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 9.0.x

      - name: Add MinVer and Reproducible Builds
        run: |
          dotnet add package MinVer
          dotnet add package DotNet.ReproducibleBuilds

      # Pack single-precision version
      - name: Pack Single Precision
        run: dotnet pack --configuration Release --output ${{ env.NuGetDirectory }}

      # Pack double-precision version
      - name: Pack Double Precision
        run: dotnet pack --configuration Release -p:DoublePrecision=true --output ${{ env.NuGetDirectory }}

      # Upload artifacts
      - uses: actions/upload-artifact@v4
        with:
          name: nuget
          if-no-files-found: error
          retention-days: 7
          path: ${{ env.NuGetDirectory }}/*

  validate_nuget:

    runs-on: ubuntu-latest
    needs: [create_nuget]
    steps:
      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 9.0.x

      - name: Download NuGet Packages
        uses: actions/download-artifact@v4
        with:
          name: nuget
          path: ${{ env.NuGetDirectory }}

      - name: Install NuGet Validator
        run: dotnet tool update Meziantou.Framework.NuGetPackageValidation.Tool --global

      - name: Validate NuGet Packages
        run: |
          foreach ($file in Get-ChildItem "${{ env.NuGetDirectory }}" -Recurse -Include *.nupkg) {
              meziantou.validate-nuget-package $file
          }

  run_test:

    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        precision:
          - single
          - double
    name: Run Tests (${{ matrix.precision }})

    defaults:
      run:
        working-directory: ./src/JitterTests

    steps:
      - uses: actions/checkout@v4
      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 10.0.x

      - name: Restore dependencies
        run: dotnet restore

      - name: Run Tests - Single Precision
        if: matrix.precision == 'single'
        run: dotnet test --configuration Release --no-restore

      - name: Run Tests - Double Precision
        if: matrix.precision == 'double'
        run: dotnet test --configuration Release --no-restore -p:DoublePrecision=true

  deploy:

    if: github.event_name == 'release'
    runs-on: ubuntu-latest
    needs: [validate_nuget, run_test]
    steps:
      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: 9.0.x

      - name: Download NuGet Packages
        uses: actions/download-artifact@v4
        with:
          name: nuget
          path: ${{ env.NuGetDirectory }}

      - name: Publish NuGet Packages
        run: |
          dotnet nuget add source --username notgiven688 --password ${{ secrets.GITHUB_TOKEN }} --store-password-in-clear-text --name github "https://nuget.pkg.github.com/notgiven688/index.json"

          foreach ($file in Get-ChildItem "${{ env.NuGetDirectory }}" -Recurse -Include *.nupkg) {
              dotnet nuget push $file --api-key "${{ secrets.NUGET_APIKEY }}" --source https://api.nuget.org/v3/index.json --skip-duplicate
              dotnet nuget push $file --source "github" --skip-duplicate
          }


================================================
FILE: .github/workflows/test-deploy-docs.yml
================================================
name: Build documentation

on:
  pull_request:
    branches:
      - main

jobs:
  test-deploy:
    name: Build documentation
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '9.0.x'

      - name: Install docfx
        run: dotnet tool install -g docfx

      - name: Generate API metadata
        run: docfx metadata
        working-directory: docfx

      - name: Build documentation
        run: docfx build
        working-directory: docfx


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) Thorben Linneweber and contributors

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

================================================
FILE: README.md
================================================
#  <img src="./media/logo/jitterstringsmallsmall.png" alt="screenshot" width="240"/> Jitter Physics 2

[![GitHub Actions Workflow Status](https://img.shields.io/github/actions/workflow/status/notgiven688/jitterphysics2/jitter-tests.yml?label=JitterTests)](https://github.com/notgiven688/jitterphysics2/actions/workflows/jitter-tests.yml)
[![Nuget](https://img.shields.io/nuget/v/Jitter2?color=yellow)](https://www.nuget.org/packages/Jitter2/)
[![Discord](https://img.shields.io/discord/1213790465225138197?logo=discord&logoColor=lightgray&label=discord&color=blue)](https://discord.gg/7jr3f4edmV)

Jitter Physics 2, the evolution of [Jitter Physics](https://github.com/notgiven688/jitterphysics), is an impulse-based dynamics engine with a semi-implicit Euler integrator. It is a fast, simple, and dependency-free engine written in C# with a clear and user-friendly API.

📦 The official **NuGet** package ([changelog](https://jitterphysics.com/docs/changelog)) can be found [here](https://www.nuget.org/packages/Jitter2), the *double precision* version [here](https://www.nuget.org/packages/Jitter2.Double).

---

▶️ Try the interactive demo and explore the docs at **[jitterphysics.com](https://jitterphysics.com/docs/introduction.html)**.

There is also a tiny demo available for the [Godot engine](other/GodotDemo) 🎮.

---

<img src="./media/screenshots/jitter_screenshot0.png" alt="screenshot" width="400"/> <img src="./media/screenshots/jitter_screenshot1.png" alt="screenshot" width="400"/>

<img src="./media/screenshots/jitter_screenshot2.png" alt="screenshot" width="400"/> <img src="./media/screenshots/jitter_screenshot4.png" alt="screenshot" width="400"/>

## Getting Started

Jitter is cross-platform. The `src` directory contains four projects:

| Project          | Description                                                |
|------------------|------------------------------------------------------------|
| Jitter2          | The main library housing Jitter2's functionalities.         |
| JitterDemo       | Features demo scenes rendered with OpenGL, tested on Linux and Windows. |
| JitterBenchmark  | The setup for conducting benchmarks using BenchmarkDotNet.  |
| JitterTests      | Unit tests utilizing NUnit.                                |

To run the demo scenes:

- Install [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet/10.0)
- `git clone https://github.com/notgiven688/jitterphysics2.git`
- `cd ./jitterphysics2/src/JitterDemo && dotnet run -c Release`

JitterDemo uses [GLFW](https://www.glfw.org/) for accessing OpenGL and managing windows, and [cimgui](https://github.com/cimgui/cimgui) for GUI rendering. The project contains these native binaries in precompiled form.

## Features

- [x] Compile time option for double precision.
- [x] Optional cross-platform deterministic solver mode for reproducible simulation.
- [x] Speculative contacts (avoiding the bullet-through-paper problem).
- [x] A variety of constraints and motors (AngularMotor, BallSocket, ConeLimit, DistanceLimit, FixedAngle, HingeAngle, LinearMotor, PointOnLine, PointOnPlane, TwistAngle) with support for softness.
- [x] A sophisticated deactivation scheme with minimal cost for inactive rigid bodies (scenes with 100k inactive bodies are easily achievable).
- [x] Edge collision filter for internal edges of triangle meshes.
- [x] Substepping for improved constraint and contact stability.
- [x] Generic convex-convex collision detection using EPA-aided MPR.
- [x] "One-shot" contact manifolds using auxiliary contacts for flat surface collisions.
- [x] Efficient compound shapes.
- [x] Easy integration of custom shapes. Integrated: Box, Capsule, Cone, Convex Hull, Point Cloud, Sphere, Triangle, Transformed.
- [x] Soft-body dynamics!

## Documentation

Find the [documentation here](https://notgiven688.github.io/jitterphysics2).

## Credits

Grateful acknowledgment to Erin Catto, Dirk Gregorius, Erwin Coumans, Gino van den Bergen, Daniel Chappuis, Marijn Tamis, Danny Chapman, Gary Snethen, and Christer Ericson for sharing their knowledge through forum posts, talks, code, papers, and books.

Special thanks also to the contributors of the predecessor projects JigLibX and Jitter.

## Contribute 👋

Contributions of all forms are welcome! Feel free to fork the project and create a pull request.


================================================
FILE: docfx/.gitignore
================================================
_site/
api/


================================================
FILE: docfx/AppBundle/WebDemo.runtimeconfig.json
================================================
{
  "runtimeOptions": {
    "tfm": "net9.0",
    "includedFrameworks": [
      {
        "name": "Microsoft.NETCore.App",
        "version": "9.0.12"
      }
    ],
    "wasmHostProperties": {
      "perHostConfig": [
        {
          "name": "browser",
          "html-path": "index.html",
          "Host": "browser"
        }
      ],
      "runtimeArgs": [],
      "mainAssembly": "WebDemo.dll"
    },
    "configProperties": {
      "Microsoft.Extensions.DependencyInjection.VerifyOpenGenericServiceTrimmability": true,
      "System.ComponentModel.DefaultValueAttribute.IsSupported": false,
      "System.ComponentModel.Design.IDesignerHost.IsSupported": false,
      "System.ComponentModel.TypeConverter.EnableUnsafeBinaryFormatterInDesigntimeLicenseContextSerialization": false,
      "System.ComponentModel.TypeDescriptor.IsComObjectDescriptorSupported": false,
      "System.Diagnostics.Debugger.IsSupported": false,
      "System.Diagnostics.Metrics.Meter.IsSupported": false,
      "System.Diagnostics.Tracing.EventSource.IsSupported": false,
      "System.Globalization.Invariant": true,
      "System.TimeZoneInfo.Invariant": false,
      "System.Globalization.PredefinedCulturesOnly": true,
      "System.Linq.Enumerable.IsSizeOptimized": true,
      "System.Net.Http.EnableActivityPropagation": false,
      "System.Net.Http.WasmEnableStreamingResponse": true,
      "System.Net.SocketsHttpHandler.Http3Support": false,
      "System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
      "System.Resources.ResourceManager.AllowCustomResourceTypes": false,
      "System.Resources.UseSystemResourceKeys": true,
      "System.Runtime.CompilerServices.RuntimeFeature.IsDynamicCodeSupported": true,
      "System.Runtime.InteropServices.BuiltInComInterop.IsSupported": false,
      "System.Runtime.InteropServices.EnableConsumingManagedCodeFromNativeHosting": false,
      "System.Runtime.InteropServices.EnableCppCLIHostActivation": false,
      "System.Runtime.InteropServices.Marshalling.EnableGeneratedComInterfaceComImportInterop": false,
      "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
      "System.StartupHookProvider.IsSupported": false,
      "System.Text.Encoding.EnableUnsafeUTF7Encoding": false,
      "System.Text.Json.JsonSerializer.IsReflectionEnabledByDefault": false,
      "System.Threading.Thread.EnableAutoreleasePool": false
    }
  }
}

================================================
FILE: docfx/AppBundle/_framework/blazor.boot.json
================================================
{
  "mainAssemblyName": "WebDemo.dll",
  "resources": {
    "hash": "sha256-hTaBZwg08pO2ImtLM7JTW8Jw7NOSyjigcWbUoIrnt6U=",
    "jsModuleNative": {
      "dotnet.native.js": "sha256-Ld26ppJjNUHS/R4z8JDWuaMVqZ2/pDQ1n0jrwXUPVFc="
    },
    "jsModuleRuntime": {
      "dotnet.runtime.js": "sha256-3egSZfVHFUpXw3QwgiaxDQns5wWmrugiXEFPbJyCk2g="
    },
    "wasmNative": {
      "dotnet.native.wasm": "sha256-4sGKLs+EUqLQmrluXnsu6Q7+ACxggCRkw8oMRVbUbCI="
    },
    "coreAssembly": {
      "Jitter2.wasm": "sha256-B7RYb1s28jtA5ZMG5vPIQaZUwX/xr+DrgnYwIgVif8A=",
      "Raylib-cs.wasm": "sha256-p2KKxq0CN7gOlnyegcTDLBJSFervFCxCMvyHz9cQ3ts=",
      "System.Collections.wasm": "sha256-ptn/+tzEZ/NpPs/MNR9RUUFYOfpXiKHnJCzl2/XZVIs=",
      "System.Private.CoreLib.wasm": "sha256-aiWEhPBDrNSlvHyAs4T76AVsz2hkupJcU6GecTE1bfc=",
      "System.Runtime.InteropServices.JavaScript.wasm": "sha256-lzbTBaA2PajlVJeqzd5sDwoXrmCvVnqahwA8Sa7zFBo=",
      "WebDemo.wasm": "sha256-bqGC9TuqOglAms1NcwLG/ICV7sdEzOCPdrbklt1R5Dk="
    },
    "assembly": {},
    "coreVfs": {
      "runtimeconfig.bin": {
        "supportFiles/5_runtimeconfig.bin": "sha256-65l+4uofoVjFHnghWH/N0CP6P3I+PzGORhkPInxhR3g="
      }
    },
    "vfs": {
      "assets/JetBrainsMono-LICENSE.txt": {
        "supportFiles/0_JetBrainsMono-LICENSE.txt": "sha256-MPDBNuPIjkItB5Gs2XI4hw+QVKlym8NM8v8NTtjKxK0="
      },
      "assets/JetBrainsMono-Regular.ttf": {
        "supportFiles/1_JetBrainsMono-Regular.ttf": "sha256-oL9g7w+Dxe1NenXUWDhUix9oczct+siPcYBEkYmNE48="
      },
      "assets/lighting.fs": {
        "supportFiles/2_lighting.fs": "sha256-9P7bpnmnFzpHKF+2l7LLdMsUr3+eHrSVFvOYCzJ9QRM="
      },
      "assets/lighting.vs": {
        "supportFiles/3_lighting.vs": "sha256-J7tfxNROREVTHbd5xFSmwN74ufTd78DeWF/DD2wSKeI="
      },
      "assets/texel_checker.png": {
        "supportFiles/4_texel_checker.png": "sha256-Be5loiaHS9Db/IzlI0PxCQy9VfAmdDAx8VX98CAUSEc="
      }
    }
  },
  "debugLevel": 0,
  "globalizationMode": "invariant"
}

================================================
FILE: docfx/AppBundle/_framework/dotnet.js
================================================
//! Licensed to the .NET Foundation under one or more agreements.
//! The .NET Foundation licenses this file to you under the MIT license.
var e=!1;const t=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11])),o=async()=>WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,5,1,96,0,1,123,3,2,1,0,10,10,1,8,0,65,0,253,15,253,98,11])),n=Symbol.for("wasm promise_control");function r(e,t){let o=null;const r=new Promise((function(n,r){o={isDone:!1,promise:null,resolve:t=>{o.isDone||(o.isDone=!0,n(t),e&&e())},reject:e=>{o.isDone||(o.isDone=!0,r(e),t&&t())}}}));o.promise=r;const i=r;return i[n]=o,{promise:i,promise_control:o}}function i(e){return e[n]}function s(e){e&&function(e){return void 0!==e[n]}(e)||Ke(!1,"Promise is not controllable")}const a="__mono_message__",l=["debug","log","trace","warn","info","error"],c="MONO_WASM: ";let u,d,f,m;function g(e){m=e}function h(e){if(qe.diagnosticTracing){const t="function"==typeof e?e():e;console.debug(c+t)}}function p(e,...t){console.info(c+e,...t)}function b(e,...t){console.info(e,...t)}function w(e,...t){console.warn(c+e,...t)}function y(e,...t){if(t&&t.length>0&&t[0]&&"object"==typeof t[0]){if(t[0].silent)return;if(t[0].toString)return void console.error(c+e,t[0].toString())}console.error(c+e,...t)}function v(e,t,o){return function(...n){try{let r=n[0];if(void 0===r)r="undefined";else if(null===r)r="null";else if("function"==typeof r)r=r.toString();else if("string"!=typeof r)try{r=JSON.stringify(r)}catch(e){r=r.toString()}t(o?JSON.stringify({method:e,payload:r,arguments:n.slice(1)}):[e+r,...n.slice(1)])}catch(e){f.error(`proxyConsole failed: ${e}`)}}}function _(e,t,o){d=t,m=e,f={...t};const n=`${o}/console`.replace("https://","wss://").replace("http://","ws://");u=new WebSocket(n),u.addEventListener("error",R),u.addEventListener("close",j),function(){for(const e of l)d[e]=v(`console.${e}`,T,!0)}()}function E(e){let t=30;const o=()=>{u?0==u.bufferedAmount||0==t?(e&&b(e),function(){for(const e of l)d[e]=v(`console.${e}`,f.log,!1)}(),u.removeEventListener("error",R),u.removeEventListener("close",j),u.close(1e3,e),u=void 0):(t--,globalThis.setTimeout(o,100)):e&&f&&f.log(e)};o()}function T(e){u&&u.readyState===WebSocket.OPEN?u.send(e):f.log(e)}function R(e){f.error(`[${m}] proxy console websocket error: ${e}`,e)}function j(e){f.debug(`[${m}] proxy console websocket closed: ${e}`,e)}(new Date).valueOf();const x={},A={},S={};let O,D,k;function C(){const e=Object.values(S),t=Object.values(A),o=L(e),n=L(t),r=o+n;if(0===r)return;const i=We?"%c":"",s=We?["background: purple; color: white; padding: 1px 3px; border-radius: 3px;","font-weight: bold;","font-weight: normal;"]:[],a=qe.config.linkerEnabled?"":"\nThis application was built with linking (tree shaking) disabled. \nPublished applications will be significantly smaller if you install wasm-tools workload. \nSee also https://aka.ms/dotnet-wasm-features";console.groupCollapsed(`${i}dotnet${i} Loaded ${U(r)} resources${i}${a}`,...s),e.length&&(console.groupCollapsed(`Loaded ${U(o)} resources from cache`),console.table(S),console.groupEnd()),t.length&&(console.groupCollapsed(`Loaded ${U(n)} resources from network`),console.table(A),console.groupEnd()),console.groupEnd()}async function I(){const e=O;if(e){const t=(await e.keys()).map((async t=>{t.url in x||await e.delete(t)}));await Promise.all(t)}}function M(e){return`${e.resolvedUrl}.${e.hash}`}async function P(){O=await async function(e){if(!qe.config.cacheBootResources||void 0===globalThis.caches||void 0===globalThis.document)return null;if(!1===globalThis.isSecureContext)return null;const t=`dotnet-resources-${globalThis.document.baseURI.substring(globalThis.document.location.origin.length)}`;try{return await caches.open(t)||null}catch(e){return null}}()}function L(e){return e.reduce(((e,t)=>e+(t.responseBytes||0)),0)}function U(e){return`${(e/1048576).toFixed(2)} MB`}function $(){qe.preferredIcuAsset=N(qe.config);let e="invariant"==qe.config.globalizationMode;if(!e)if(qe.preferredIcuAsset)qe.diagnosticTracing&&h("ICU data archive(s) available, disabling invariant mode");else{if("custom"===qe.config.globalizationMode||"all"===qe.config.globalizationMode||"sharded"===qe.config.globalizationMode){const e="invariant globalization mode is inactive and no ICU data archives are available";throw y(`ERROR: ${e}`),new Error(e)}qe.diagnosticTracing&&h("ICU data archive(s) not available, using invariant globalization mode"),e=!0,qe.preferredIcuAsset=null}const t="DOTNET_SYSTEM_GLOBALIZATION_INVARIANT",o="DOTNET_SYSTEM_GLOBALIZATION_HYBRID",n=qe.config.environmentVariables;if(void 0===n[o]&&"hybrid"===qe.config.globalizationMode?n[o]="1":void 0===n[t]&&e&&(n[t]="1"),void 0===n.TZ)try{const e=Intl.DateTimeFormat().resolvedOptions().timeZone||null;e&&(n.TZ=e)}catch(e){p("failed to detect timezone, will fallback to UTC")}}function N(e){var t;if((null===(t=e.resources)||void 0===t?void 0:t.icu)&&"invariant"!=e.globalizationMode){const t=e.applicationCulture||(We?globalThis.navigator&&globalThis.navigator.languages&&globalThis.navigator.languages[0]:Intl.DateTimeFormat().resolvedOptions().locale),o=Object.keys(e.resources.icu),n={};for(let t=0;t<o.length;t++){const r=o[t];e.resources.fingerprinting?n[me(r)]=r:n[r]=r}let r=null;if("custom"===e.globalizationMode){if(o.length>=1)return o[0]}else"hybrid"===e.globalizationMode?r="icudt_hybrid.dat":t&&"all"!==e.globalizationMode?"sharded"===e.globalizationMode&&(r=function(e){const t=e.split("-")[0];return"en"===t||["fr","fr-FR","it","it-IT","de","de-DE","es","es-ES"].includes(e)?"icudt_EFIGS.dat":["zh","ko","ja"].includes(t)?"icudt_CJK.dat":"icudt_no_CJK.dat"}(t)):r="icudt.dat";if(r&&n[r])return n[r]}return e.globalizationMode="invariant",null}const z=class{constructor(e){this.url=e}toString(){return this.url}};async function W(e,t){try{const o="function"==typeof globalThis.fetch;if(Ue){const n=e.startsWith("file://");if(!n&&o)return globalThis.fetch(e,t||{credentials:"same-origin"});D||(k=He.require("url"),D=He.require("fs")),n&&(e=k.fileURLToPath(e));const r=await D.promises.readFile(e);return{ok:!0,headers:{length:0,get:()=>null},url:e,arrayBuffer:()=>r,json:()=>JSON.parse(r),text:()=>{throw new Error("NotImplementedException")}}}if(o)return globalThis.fetch(e,t||{credentials:"same-origin"});if("function"==typeof read)return{ok:!0,url:e,headers:{length:0,get:()=>null},arrayBuffer:()=>new Uint8Array(read(e,"binary")),json:()=>JSON.parse(read(e,"utf8")),text:()=>read(e,"utf8")}}catch(t){return{ok:!1,url:e,status:500,headers:{length:0,get:()=>null},statusText:"ERR28: "+t,arrayBuffer:()=>{throw t},json:()=>{throw t},text:()=>{throw t}}}throw new Error("No fetch implementation available")}function B(e){return"string"!=typeof e&&Ke(!1,"url must be a string"),!q(e)&&0!==e.indexOf("./")&&0!==e.indexOf("../")&&globalThis.URL&&globalThis.document&&globalThis.document.baseURI&&(e=new URL(e,globalThis.document.baseURI).toString()),e}const F=/^[a-zA-Z][a-zA-Z\d+\-.]*?:\/\//,V=/[a-zA-Z]:[\\/]/;function q(e){return Ue||Be?e.startsWith("/")||e.startsWith("\\")||-1!==e.indexOf("///")||V.test(e):F.test(e)}let G,H=0;const J=[],Z=[],Q=new Map,Y={"js-module-threads":!0,"js-module-globalization":!0,"js-module-runtime":!0,"js-module-dotnet":!0,"js-module-native":!0},K={...Y,"js-module-library-initializer":!0},X={...Y,dotnetwasm:!0,heap:!0,manifest:!0},ee={...K,manifest:!0},te={...K,dotnetwasm:!0},oe={dotnetwasm:!0,symbols:!0,"segmentation-rules":!0},ne={...K,dotnetwasm:!0,symbols:!0,"segmentation-rules":!0},re={symbols:!0,"segmentation-rules":!0};function ie(e){return!("icu"==e.behavior&&e.name!=qe.preferredIcuAsset)}function se(e,t,o){const n=Object.keys(t||{});Ke(1==n.length,`Expect to have one ${o} asset in resources`);const r=n[0],i={name:r,hash:t[r],behavior:o};return ae(i),e.push(i),i}function ae(e){X[e.behavior]&&Q.set(e.behavior,e)}function le(e){const t=function(e){Ke(X[e],`Unknown single asset behavior ${e}`);const t=Q.get(e);return Ke(t,`Single asset for ${e} not found`),t}(e);if(!t.resolvedUrl)if(t.resolvedUrl=qe.locateFile(t.name),Y[t.behavior]){const e=Te(t);e?("string"!=typeof e&&Ke(!1,"loadBootResource response for 'dotnetjs' type should be a URL string"),t.resolvedUrl=e):t.resolvedUrl=we(t.resolvedUrl,t.behavior)}else if("dotnetwasm"!==t.behavior)throw new Error(`Unknown single asset behavior ${e}`);return t}let ce=!1;async function ue(){if(!ce){ce=!0,qe.diagnosticTracing&&h("mono_download_assets");try{const e=[],t=[],o=(e,t)=>{!ne[e.behavior]&&ie(e)&&qe.expected_instantiated_assets_count++,!te[e.behavior]&&ie(e)&&(qe.expected_downloaded_assets_count++,t.push(he(e)))};for(const t of J)o(t,e);for(const e of Z)o(e,t);qe.allDownloadsQueued.promise_control.resolve(),Promise.all([...e,...t]).then((()=>{qe.allDownloadsFinished.promise_control.resolve()})).catch((e=>{throw qe.err("Error in mono_download_assets: "+e),at(1,e),e})),await qe.runtimeModuleLoaded.promise;const n=async e=>{const t=await e;if(t.buffer){if(!ne[t.behavior]){t.buffer&&"object"==typeof t.buffer||Ke(!1,"asset buffer must be array-like or buffer-like or promise of these"),"string"!=typeof t.resolvedUrl&&Ke(!1,"resolvedUrl must be string");const e=t.resolvedUrl,o=await t.buffer,n=new Uint8Array(o);Re(t),await Fe.beforeOnRuntimeInitialized.promise,Fe.instantiate_asset(t,e,n)}}else oe[t.behavior]?("symbols"===t.behavior?(await Fe.instantiate_symbols_asset(t),Re(t)):"segmentation-rules"===t.behavior&&(await Fe.instantiate_segmentation_rules_asset(t),Re(t)),oe[t.behavior]&&++qe.actual_downloaded_assets_count):(t.isOptional||Ke(!1,"Expected asset to have the downloaded buffer"),!te[t.behavior]&&ie(t)&&qe.expected_downloaded_assets_count--,!ne[t.behavior]&&ie(t)&&qe.expected_instantiated_assets_count--)},r=[],i=[];for(const t of e)r.push(n(t));for(const e of t)i.push(n(e));Promise.all(r).then((()=>{ze||Fe.coreAssetsInMemory.promise_control.resolve()})).catch((e=>{throw qe.err("Error in mono_download_assets: "+e),at(1,e),e})),Promise.all(i).then((async()=>{ze||(await Fe.coreAssetsInMemory.promise,Fe.allAssetsInMemory.promise_control.resolve())})).catch((e=>{throw qe.err("Error in mono_download_assets: "+e),at(1,e),e}))}catch(e){throw qe.err("Error in mono_download_assets: "+e),e}}}let de=!1;function fe(){if(de)return;de=!0;const e=qe.config,t=[];if(e.assets)for(const t of e.assets)"object"!=typeof t&&Ke(!1,`asset must be object, it was ${typeof t} : ${t}`),"string"!=typeof t.behavior&&Ke(!1,"asset behavior must be known string"),"string"!=typeof t.name&&Ke(!1,"asset name must be string"),t.resolvedUrl&&"string"!=typeof t.resolvedUrl&&Ke(!1,"asset resolvedUrl could be string"),t.hash&&"string"!=typeof t.hash&&Ke(!1,"asset resolvedUrl could be string"),t.pendingDownload&&"object"!=typeof t.pendingDownload&&Ke(!1,"asset pendingDownload could be object"),t.isCore?J.push(t):Z.push(t),ae(t);else if(e.resources){const o=e.resources;o.wasmNative||Ke(!1,"resources.wasmNative must be defined"),o.jsModuleNative||Ke(!1,"resources.jsModuleNative must be defined"),o.jsModuleRuntime||Ke(!1,"resources.jsModuleRuntime must be defined"),se(Z,o.wasmNative,"dotnetwasm"),se(t,o.jsModuleNative,"js-module-native"),se(t,o.jsModuleRuntime,"js-module-runtime"),"hybrid"==e.globalizationMode&&se(t,o.jsModuleGlobalization,"js-module-globalization");const n=(e,t)=>{!o.fingerprinting||"assembly"!=e.behavior&&"pdb"!=e.behavior&&"resource"!=e.behavior||(e.virtualPath=me(e.name)),t?(e.isCore=!0,J.push(e)):Z.push(e)};if(o.coreAssembly)for(const e in o.coreAssembly)n({name:e,hash:o.coreAssembly[e],behavior:"assembly"},!0);if(o.assembly)for(const e in o.assembly)n({name:e,hash:o.assembly[e],behavior:"assembly"},!o.coreAssembly);if(0!=e.debugLevel){if(o.corePdb)for(const e in o.corePdb)n({name:e,hash:o.corePdb[e],behavior:"pdb"},!0);if(o.pdb)for(const e in o.pdb)n({name:e,hash:o.pdb[e],behavior:"pdb"},!o.corePdb)}if(e.loadAllSatelliteResources&&o.satelliteResources)for(const e in o.satelliteResources)for(const t in o.satelliteResources[e])n({name:t,hash:o.satelliteResources[e][t],behavior:"resource",culture:e},!o.coreAssembly);if(o.coreVfs)for(const e in o.coreVfs)for(const t in o.coreVfs[e])n({name:t,hash:o.coreVfs[e][t],behavior:"vfs",virtualPath:e},!0);if(o.vfs)for(const e in o.vfs)for(const t in o.vfs[e])n({name:t,hash:o.vfs[e][t],behavior:"vfs",virtualPath:e},!o.coreVfs);const r=N(e);if(r&&o.icu)for(const e in o.icu)e===r?Z.push({name:e,hash:o.icu[e],behavior:"icu",loadRemote:!0}):e.startsWith("segmentation-rules")&&e.endsWith(".json")&&Z.push({name:e,hash:o.icu[e],behavior:"segmentation-rules"});if(o.wasmSymbols)for(const e in o.wasmSymbols)J.push({name:e,hash:o.wasmSymbols[e],behavior:"symbols"})}if(e.appsettings)for(let t=0;t<e.appsettings.length;t++){const o=e.appsettings[t],n=je(o);"appsettings.json"!==n&&n!==`appsettings.${e.applicationEnvironment}.json`||Z.push({name:o,behavior:"vfs",noCache:!0,useCredentials:!0})}e.assets=[...J,...Z,...t]}function me(e){var t;const o=null===(t=qe.config.resources)||void 0===t?void 0:t.fingerprinting;return o&&o[e]?o[e]:e}async function ge(e){const t=await he(e);return await t.pendingDownloadInternal.response,t.buffer}async function he(e){try{return await pe(e)}catch(t){if(!qe.enableDownloadRetry)throw t;if(Be||Ue)throw t;if(e.pendingDownload&&e.pendingDownloadInternal==e.pendingDownload)throw t;if(e.resolvedUrl&&-1!=e.resolvedUrl.indexOf("file://"))throw t;if(t&&404==t.status)throw t;e.pendingDownloadInternal=void 0,await qe.allDownloadsQueued.promise;try{return qe.diagnosticTracing&&h(`Retrying download '${e.name}'`),await pe(e)}catch(t){return e.pendingDownloadInternal=void 0,await new Promise((e=>globalThis.setTimeout(e,100))),qe.diagnosticTracing&&h(`Retrying download (2) '${e.name}' after delay`),await pe(e)}}}async function pe(e){for(;G;)await G.promise;try{++H,H==qe.maxParallelDownloads&&(qe.diagnosticTracing&&h("Throttling further parallel downloads"),G=r());const t=await async function(e){if(e.pendingDownload&&(e.pendingDownloadInternal=e.pendingDownload),e.pendingDownloadInternal&&e.pendingDownloadInternal.response)return e.pendingDownloadInternal.response;if(e.buffer){const t=await e.buffer;return e.resolvedUrl||(e.resolvedUrl="undefined://"+e.name),e.pendingDownloadInternal={url:e.resolvedUrl,name:e.name,response:Promise.resolve({ok:!0,arrayBuffer:()=>t,json:()=>JSON.parse(new TextDecoder("utf-8").decode(t)),text:()=>{throw new Error("NotImplementedException")},headers:{get:()=>{}}})},e.pendingDownloadInternal.response}const t=e.loadRemote&&qe.config.remoteSources?qe.config.remoteSources:[""];let o;for(let n of t){n=n.trim(),"./"===n&&(n="");const t=be(e,n);e.name===t?qe.diagnosticTracing&&h(`Attempting to download '${t}'`):qe.diagnosticTracing&&h(`Attempting to download '${t}' for ${e.name}`);try{e.resolvedUrl=t;const n=_e(e);if(e.pendingDownloadInternal=n,o=await n.response,!o||!o.ok)continue;return o}catch(e){o||(o={ok:!1,url:t,status:0,statusText:""+e});continue}}const n=e.isOptional||e.name.match(/\.pdb$/)&&qe.config.ignorePdbLoadErrors;if(o||Ke(!1,`Response undefined ${e.name}`),!n){const t=new Error(`download '${o.url}' for ${e.name} failed ${o.status} ${o.statusText}`);throw t.status=o.status,t}p(`optional download '${o.url}' for ${e.name} failed ${o.status} ${o.statusText}`)}(e);return t?(oe[e.behavior]||(e.buffer=await t.arrayBuffer(),++qe.actual_downloaded_assets_count),e):e}finally{if(--H,G&&H==qe.maxParallelDownloads-1){qe.diagnosticTracing&&h("Resuming more parallel downloads");const e=G;G=void 0,e.promise_control.resolve()}}}function be(e,t){let o;return null==t&&Ke(!1,`sourcePrefix must be provided for ${e.name}`),e.resolvedUrl?o=e.resolvedUrl:(o=""===t?"assembly"===e.behavior||"pdb"===e.behavior?e.name:"resource"===e.behavior&&e.culture&&""!==e.culture?`${e.culture}/${e.name}`:e.name:t+e.name,o=we(qe.locateFile(o),e.behavior)),o&&"string"==typeof o||Ke(!1,"attemptUrl need to be path or url string"),o}function we(e,t){return qe.modulesUniqueQuery&&ee[t]&&(e+=qe.modulesUniqueQuery),e}let ye=0;const ve=new Set;function _e(e){try{e.resolvedUrl||Ke(!1,"Request's resolvedUrl must be set");const t=async function(e){let t=await async function(e){const t=O;if(!t||e.noCache||!e.hash||0===e.hash.length)return;const o=M(e);let n;x[o]=!0;try{n=await t.match(o)}catch(e){}if(!n)return;const r=parseInt(n.headers.get("content-length")||"0");return S[e.name]={responseBytes:r},n}(e);return t||(t=await function(e){let t=e.resolvedUrl;if(qe.loadBootResource){const o=Te(e);if(o instanceof Promise)return o;"string"==typeof o&&(t=o)}const o={};return qe.config.disableNoCacheFetch||(o.cache="no-cache"),e.useCredentials?o.credentials="include":!qe.config.disableIntegrityCheck&&e.hash&&(o.integrity=e.hash),qe.fetch_like(t,o)}(e),function(e,t){const o=O;if(!o||e.noCache||!e.hash||0===e.hash.length)return;const n=t.clone();setTimeout((()=>{const t=M(e);!async function(e,t,o,n){const r=await n.arrayBuffer(),i=function(e){if("undefined"!=typeof performance)return performance.getEntriesByName(e)[0]}(n.url),s=i&&i.encodedBodySize||void 0;A[t]={responseBytes:s};const a=new Response(r,{headers:{"content-type":n.headers.get("content-type")||"","content-length":(s||n.headers.get("content-length")||"").toString()}});try{await e.put(o,a)}catch(e){}}(o,e.name,t,n)}),0)}(e,t)),t}(e),o={name:e.name,url:e.resolvedUrl,response:t};return ve.add(e.name),o.response.then((()=>{"assembly"==e.behavior&&qe.loadedAssemblies.push(e.name),ye++,qe.onDownloadResourceProgress&&qe.onDownloadResourceProgress(ye,ve.size)})),o}catch(t){const o={ok:!1,url:e.resolvedUrl,status:500,statusText:"ERR29: "+t,arrayBuffer:()=>{throw t},json:()=>{throw t}};return{name:e.name,url:e.resolvedUrl,response:Promise.resolve(o)}}}const Ee={resource:"assembly",assembly:"assembly",pdb:"pdb",icu:"globalization",vfs:"configuration",manifest:"manifest",dotnetwasm:"dotnetwasm","js-module-dotnet":"dotnetjs","js-module-native":"dotnetjs","js-module-runtime":"dotnetjs","js-module-threads":"dotnetjs"};function Te(e){var t;if(qe.loadBootResource){const o=null!==(t=e.hash)&&void 0!==t?t:"",n=e.resolvedUrl,r=Ee[e.behavior];if(r){const t=qe.loadBootResource(r,e.name,n,o,e.behavior);return"string"==typeof t?B(t):t}}}function Re(e){e.pendingDownloadInternal=null,e.pendingDownload=null,e.buffer=null,e.moduleExports=null}function je(e){let t=e.lastIndexOf("/");return t>=0&&t++,e.substring(t)}async function xe(e){if(!e)return;const t=Object.keys(e);await Promise.all(t.map((e=>async function(e){try{const t=we(qe.locateFile(e),"js-module-library-initializer");qe.diagnosticTracing&&h(`Attempting to import '${t}' for ${e}`);const o=await import(/*! webpackIgnore: true */t);qe.libraryInitializers.push({scriptName:e,exports:o})}catch(t){w(`Failed to import library initializer '${e}': ${t}`)}}(e))))}async function Ae(e,t){if(!qe.libraryInitializers)return;const o=[];for(let n=0;n<qe.libraryInitializers.length;n++){const r=qe.libraryInitializers[n];r.exports[e]&&o.push(Se(r.scriptName,e,(()=>r.exports[e](...t))))}await Promise.all(o)}async function Se(e,t,o){try{await o()}catch(o){throw w(`Failed to invoke '${t}' on library initializer '${e}': ${o}`),at(1,o),o}}var Oe="Release";function De(e,t){if(e===t)return e;const o={...t};return void 0!==o.assets&&o.assets!==e.assets&&(o.assets=[...e.assets||[],...o.assets||[]]),void 0!==o.resources&&(o.resources=Ce(e.resources||{assembly:{},jsModuleNative:{},jsModuleRuntime:{},wasmNative:{}},o.resources)),void 0!==o.environmentVariables&&(o.environmentVariables={...e.environmentVariables||{},...o.environmentVariables||{}}),void 0!==o.runtimeOptions&&o.runtimeOptions!==e.runtimeOptions&&(o.runtimeOptions=[...e.runtimeOptions||[],...o.runtimeOptions||[]]),Object.assign(e,o)}function ke(e,t){if(e===t)return e;const o={...t};return o.config&&(e.config||(e.config={}),o.config=De(e.config,o.config)),Object.assign(e,o)}function Ce(e,t){if(e===t)return e;const o={...t};return void 0!==o.assembly&&(o.assembly={...e.assembly||{},...o.assembly||{}}),void 0!==o.lazyAssembly&&(o.lazyAssembly={...e.lazyAssembly||{},...o.lazyAssembly||{}}),void 0!==o.pdb&&(o.pdb={...e.pdb||{},...o.pdb||{}}),void 0!==o.jsModuleWorker&&(o.jsModuleWorker={...e.jsModuleWorker||{},...o.jsModuleWorker||{}}),void 0!==o.jsModuleNative&&(o.jsModuleNative={...e.jsModuleNative||{},...o.jsModuleNative||{}}),void 0!==o.jsModuleGlobalization&&(o.jsModuleGlobalization={...e.jsModuleGlobalization||{},...o.jsModuleGlobalization||{}}),void 0!==o.jsModuleRuntime&&(o.jsModuleRuntime={...e.jsModuleRuntime||{},...o.jsModuleRuntime||{}}),void 0!==o.wasmSymbols&&(o.wasmSymbols={...e.wasmSymbols||{},...o.wasmSymbols||{}}),void 0!==o.wasmNative&&(o.wasmNative={...e.wasmNative||{},...o.wasmNative||{}}),void 0!==o.icu&&(o.icu={...e.icu||{},...o.icu||{}}),void 0!==o.satelliteResources&&(o.satelliteResources=Ie(e.satelliteResources||{},o.satelliteResources||{})),void 0!==o.modulesAfterConfigLoaded&&(o.modulesAfterConfigLoaded={...e.modulesAfterConfigLoaded||{},...o.modulesAfterConfigLoaded||{}}),void 0!==o.modulesAfterRuntimeReady&&(o.modulesAfterRuntimeReady={...e.modulesAfterRuntimeReady||{},...o.modulesAfterRuntimeReady||{}}),void 0!==o.extensions&&(o.extensions={...e.extensions||{},...o.extensions||{}}),void 0!==o.vfs&&(o.vfs=Ie(e.vfs||{},o.vfs||{})),Object.assign(e,o)}function Ie(e,t){if(e===t)return e;for(const o in t)e[o]={...e[o],...t[o]};return e}function Me(){const e=qe.config;if(e.environmentVariables=e.environmentVariables||{},e.runtimeOptions=e.runtimeOptions||[],e.resources=e.resources||{assembly:{},jsModuleNative:{},jsModuleGlobalization:{},jsModuleWorker:{},jsModuleRuntime:{},wasmNative:{},vfs:{},satelliteResources:{}},e.assets){qe.diagnosticTracing&&h("config.assets is deprecated, use config.resources instead");for(const t of e.assets){const o={};o[t.name]=t.hash||"";const n={};switch(t.behavior){case"assembly":n.assembly=o;break;case"pdb":n.pdb=o;break;case"resource":n.satelliteResources={},n.satelliteResources[t.culture]=o;break;case"icu":n.icu=o;break;case"symbols":n.wasmSymbols=o;break;case"vfs":n.vfs={},n.vfs[t.virtualPath]=o;break;case"dotnetwasm":n.wasmNative=o;break;case"js-module-threads":n.jsModuleWorker=o;break;case"js-module-globalization":n.jsModuleGlobalization=o;break;case"js-module-runtime":n.jsModuleRuntime=o;break;case"js-module-native":n.jsModuleNative=o;break;case"js-module-dotnet":break;default:throw new Error(`Unexpected behavior ${t.behavior} of asset ${t.name}`)}Ce(e.resources,n)}}void 0===e.debugLevel&&"Debug"===Oe&&(e.debugLevel=-1),void 0===e.cachedResourcesPurgeDelay&&(e.cachedResourcesPurgeDelay=1e4),e.applicationCulture&&(e.environmentVariables.LANG=`${e.applicationCulture}.UTF-8`),Fe.diagnosticTracing=qe.diagnosticTracing=!!e.diagnosticTracing,Fe.waitForDebugger=e.waitForDebugger,Fe.enablePerfMeasure=!!e.browserProfilerOptions&&globalThis.performance&&"function"==typeof globalThis.performance.measure,qe.maxParallelDownloads=e.maxParallelDownloads||qe.maxParallelDownloads,qe.enableDownloadRetry=void 0!==e.enableDownloadRetry?e.enableDownloadRetry:qe.enableDownloadRetry}let Pe=!1;async function Le(e){var t;if(Pe)return void await qe.afterConfigLoaded.promise;let o;try{if(e.configSrc||qe.config&&0!==Object.keys(qe.config).length&&(qe.config.assets||qe.config.resources)||(e.configSrc="./blazor.boot.json"),o=e.configSrc,Pe=!0,o&&(qe.diagnosticTracing&&h("mono_wasm_load_config"),await async function(e){const t=qe.locateFile(e.configSrc),o=void 0!==qe.loadBootResource?qe.loadBootResource("manifest","blazor.boot.json",t,"","manifest"):i(t);let n;n=o?"string"==typeof o?await i(B(o)):await o:await i(we(t,"manifest"));const r=await async function(e){const t=qe.config,o=await e.json();t.applicationEnvironment||(o.applicationEnvironment=e.headers.get("Blazor-Environment")||e.headers.get("DotNet-Environment")||"Production"),o.environmentVariables||(o.environmentVariables={});const n=e.headers.get("DOTNET-MODIFIABLE-ASSEMBLIES");n&&(o.environmentVariables.DOTNET_MODIFIABLE_ASSEMBLIES=n);const r=e.headers.get("ASPNETCORE-BROWSER-TOOLS");return r&&(o.environmentVariables.__ASPNETCORE_BROWSER_TOOLS=r),o}(n);function i(e){return qe.fetch_like(e,{method:"GET",credentials:"include",cache:"no-cache"})}De(qe.config,r)}(e)),Me(),await xe(null===(t=qe.config.resources)||void 0===t?void 0:t.modulesAfterConfigLoaded),await Ae("onRuntimeConfigLoaded",[qe.config]),e.onConfigLoaded)try{await e.onConfigLoaded(qe.config,Ge),Me()}catch(e){throw y("onConfigLoaded() failed",e),e}Me(),qe.afterConfigLoaded.promise_control.resolve(qe.config)}catch(t){const n=`Failed to load config file ${o} ${t} ${null==t?void 0:t.stack}`;throw qe.config=e.config=Object.assign(qe.config,{message:n,error:t,isError:!0}),at(1,new Error(n)),t}}"function"!=typeof importScripts||globalThis.onmessage||(globalThis.dotnetSidecar=!0);const Ue="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,$e="function"==typeof importScripts,Ne=$e&&"undefined"!=typeof dotnetSidecar,ze=$e&&!Ne,We="object"==typeof window||$e&&!Ue,Be=!We&&!Ue;let Fe={},Ve={},qe={},Ge={},He={},Je=!1;const Ze={},Qe={config:Ze},Ye={mono:{},binding:{},internal:He,module:Qe,loaderHelpers:qe,runtimeHelpers:Fe,globalizationHelpers:Ve,api:Ge};function Ke(e,t){if(e)return;const o="Assert failed: "+("function"==typeof t?t():t),n=new Error(o);y(o,n),Fe.nativeAbort(n)}function Xe(){return void 0!==qe.exitCode}function et(){return Fe.runtimeReady&&!Xe()}function tt(){Xe()&&Ke(!1,`.NET runtime already exited with ${qe.exitCode} ${qe.exitReason}. You can use runtime.runMain() which doesn't exit the runtime.`),Fe.runtimeReady||Ke(!1,".NET runtime didn't start yet. Please call dotnet.create() first.")}function ot(){We&&(globalThis.addEventListener("unhandledrejection",ct),globalThis.addEventListener("error",ut))}let nt,rt;function it(e){rt&&rt(e),at(e,qe.exitReason)}function st(e){nt&&nt(e||qe.exitReason),at(1,e||qe.exitReason)}function at(t,o){var n,r;const i=o&&"object"==typeof o;t=i&&"number"==typeof o.status?o.status:void 0===t?-1:t;const s=i&&"string"==typeof o.message?o.message:""+o;(o=i?o:Fe.ExitStatus?function(e,t){const o=new Fe.ExitStatus(e);return o.message=t,o.toString=()=>t,o}(t,s):new Error("Exit with code "+t+" "+s)).status=t,o.message||(o.message=s);const a=""+(o.stack||(new Error).stack);try{Object.defineProperty(o,"stack",{get:()=>a})}catch(e){}const l=!!o.silent;if(o.silent=!0,Xe())qe.diagnosticTracing&&h("mono_exit called after exit");else{try{Qe.onAbort==st&&(Qe.onAbort=nt),Qe.onExit==it&&(Qe.onExit=rt),We&&(globalThis.removeEventListener("unhandledrejection",ct),globalThis.removeEventListener("error",ut)),Fe.runtimeReady?(Fe.jiterpreter_dump_stats&&Fe.jiterpreter_dump_stats(!1),0===t&&(null===(n=qe.config)||void 0===n?void 0:n.interopCleanupOnExit)&&Fe.forceDisposeProxies(!0,!0),e&&0!==t&&(null===(r=qe.config)||void 0===r||r.dumpThreadsOnNonZeroExit)):(qe.diagnosticTracing&&h(`abort_startup, reason: ${o}`),function(e){qe.allDownloadsQueued.promise_control.reject(e),qe.allDownloadsFinished.promise_control.reject(e),qe.afterConfigLoaded.promise_control.reject(e),qe.wasmCompilePromise.promise_control.reject(e),qe.runtimeModuleLoaded.promise_control.reject(e),Fe.dotnetReady&&(Fe.dotnetReady.promise_control.reject(e),Fe.afterInstantiateWasm.promise_control.reject(e),Fe.beforePreInit.promise_control.reject(e),Fe.afterPreInit.promise_control.reject(e),Fe.afterPreRun.promise_control.reject(e),Fe.beforeOnRuntimeInitialized.promise_control.reject(e),Fe.afterOnRuntimeInitialized.promise_control.reject(e),Fe.afterPostRun.promise_control.reject(e))}(o))}catch(e){w("mono_exit A failed",e)}try{l||(function(e,t){if(0!==e&&t){const e=Fe.ExitStatus&&t instanceof Fe.ExitStatus?h:y;"string"==typeof t?e(t):(void 0===t.stack&&(t.stack=(new Error).stack+""),t.message?e(Fe.stringify_as_error_with_stack?Fe.stringify_as_error_with_stack(t.message+"\n"+t.stack):t.message+"\n"+t.stack):e(JSON.stringify(t)))}!ze&&qe.config&&(qe.config.logExitCode?qe.config.forwardConsoleLogsToWS?E("WASM EXIT "+e):b("WASM EXIT "+e):qe.config.forwardConsoleLogsToWS&&E())}(t,o),function(e){if(We&&!ze&&qe.config&&qe.config.appendElementOnExit&&document){const t=document.createElement("label");t.id="tests_done",0!==e&&(t.style.background="red"),t.innerHTML=""+e,document.body.appendChild(t)}}(t))}catch(e){w("mono_exit B failed",e)}qe.exitCode=t,qe.exitReason||(qe.exitReason=o),!ze&&Fe.runtimeReady&&Qe.runtimeKeepalivePop()}if(qe.config&&qe.config.asyncFlushOnExit&&0===t)throw(async()=>{try{await async function(){try{const e=await import(/*! webpackIgnore: true */"process"),t=e=>new Promise(((t,o)=>{e.on("error",o),e.end("","utf8",t)})),o=t(e.stderr),n=t(e.stdout);let r;const i=new Promise((e=>{r=setTimeout((()=>e("timeout")),1e3)}));await Promise.race([Promise.all([n,o]),i]),clearTimeout(r)}catch(e){y(`flushing std* streams failed: ${e}`)}}()}finally{lt(t,o)}})(),o;lt(t,o)}function lt(e,t){if(Fe.runtimeReady&&Fe.nativeExit)try{Fe.nativeExit(e)}catch(e){!Fe.ExitStatus||e instanceof Fe.ExitStatus||w("set_exit_code_and_quit_now failed: "+e.toString())}if(0!==e||!We)throw Ue&&He.process?He.process.exit(e):Fe.quit&&Fe.quit(e,t),t}function ct(e){dt(e,e.reason,"rejection")}function ut(e){dt(e,e.error,"error")}function dt(e,t,o){e.preventDefault();try{t||(t=new Error("Unhandled "+o)),void 0===t.stack&&(t.stack=(new Error).stack),t.stack=t.stack+"",t.silent||(y("Unhandled error:",t),at(1,t))}catch(e){}}!function(e){if(Je)throw new Error("Loader module already loaded");Je=!0,Fe=e.runtimeHelpers,Ve=e.globalizationHelpers,qe=e.loaderHelpers,Ge=e.api,He=e.internal,Object.assign(Ge,{INTERNAL:He,invokeLibraryInitializers:Ae}),Object.assign(e.module,{config:De(Ze,{environmentVariables:{}})});const n={mono_wasm_bindings_is_ready:!1,config:e.module.config,diagnosticTracing:!1,nativeAbort:e=>{throw e||new Error("abort")},nativeExit:e=>{throw new Error("exit:"+e)}},a={gitHash:"2f124007573374800632d39177cde00ca9fe1ef0",config:e.module.config,diagnosticTracing:!1,maxParallelDownloads:16,enableDownloadRetry:!0,_loaded_files:[],loadedFiles:[],loadedAssemblies:[],libraryInitializers:[],workerNextNumber:1,actual_downloaded_assets_count:0,actual_instantiated_assets_count:0,expected_downloaded_assets_count:0,expected_instantiated_assets_count:0,afterConfigLoaded:r(),allDownloadsQueued:r(),allDownloadsFinished:r(),wasmCompilePromise:r(),runtimeModuleLoaded:r(),loadingWorkers:r(),is_exited:Xe,is_runtime_running:et,assert_runtime_running:tt,mono_exit:at,createPromiseController:r,getPromiseController:i,assertIsControllablePromise:s,mono_download_assets:ue,resolve_single_asset_path:le,setup_proxy_console:_,set_thread_prefix:g,logDownloadStatsToConsole:C,purgeUnusedCacheEntriesAsync:I,installUnhandledErrorHandler:ot,retrieve_asset_download:ge,invokeLibraryInitializers:Ae,exceptions:t,simd:o};Object.assign(Fe,n),Object.assign(qe,a)}(Ye);let ft,mt,gt=!1,ht=!1;async function pt(e){if(!ht){if(ht=!0,We&&qe.config.forwardConsoleLogsToWS&&void 0!==globalThis.WebSocket&&_("main",globalThis.console,globalThis.location.origin),Qe||Ke(!1,"Null moduleConfig"),qe.config||Ke(!1,"Null moduleConfig.config"),"function"==typeof e){const t=e(Ye.api);if(t.ready)throw new Error("Module.ready couldn't be redefined.");Object.assign(Qe,t),ke(Qe,t)}else{if("object"!=typeof e)throw new Error("Can't use moduleFactory callback of createDotnetRuntime function.");ke(Qe,e)}await async function(e){if(Ue){const e=await import(/*! webpackIgnore: true */"process"),t=14;if(e.versions.node.split(".")[0]<t)throw new Error(`NodeJS at '${e.execPath}' has too low version '${e.versions.node}', please use at least ${t}. See also https://aka.ms/dotnet-wasm-features`)}const t=/*! webpackIgnore: true */import.meta.url,o=t.indexOf("?");var n;if(o>0&&(qe.modulesUniqueQuery=t.substring(o)),qe.scriptUrl=t.replace(/\\/g,"/").replace(/[?#].*/,""),qe.scriptDirectory=(n=qe.scriptUrl).slice(0,n.lastIndexOf("/"))+"/",qe.locateFile=e=>"URL"in globalThis&&globalThis.URL!==z?new URL(e,qe.scriptDirectory).toString():q(e)?e:qe.scriptDirectory+e,qe.fetch_like=W,qe.out=console.log,qe.err=console.error,qe.onDownloadResourceProgress=e.onDownloadResourceProgress,We&&globalThis.navigator){const e=globalThis.navigator,t=e.userAgentData&&e.userAgentData.brands;t&&t.length>0?qe.isChromium=t.some((e=>"Google Chrome"===e.brand||"Microsoft Edge"===e.brand||"Chromium"===e.brand)):e.userAgent&&(qe.isChromium=e.userAgent.includes("Chrome"),qe.isFirefox=e.userAgent.includes("Firefox"))}He.require=Ue?await import(/*! webpackIgnore: true */"module").then((e=>e.createRequire(/*! webpackIgnore: true */import.meta.url))):Promise.resolve((()=>{throw new Error("require not supported")})),void 0===globalThis.URL&&(globalThis.URL=z)}(Qe)}}async function bt(e){return await pt(e),nt=Qe.onAbort,rt=Qe.onExit,Qe.onAbort=st,Qe.onExit=it,Qe.ENVIRONMENT_IS_PTHREAD?async function(){(function(){const e=new MessageChannel,t=e.port1,o=e.port2;t.addEventListener("message",(e=>{var n,r;n=JSON.parse(e.data.config),r=JSON.parse(e.data.monoThreadInfo),gt?qe.diagnosticTracing&&h("mono config already received"):(De(qe.config,n),Fe.monoThreadInfo=r,Me(),qe.diagnosticTracing&&h("mono config received"),gt=!0,qe.afterConfigLoaded.promise_control.resolve(qe.config),We&&n.forwardConsoleLogsToWS&&void 0!==globalThis.WebSocket&&qe.setup_proxy_console("worker-idle",console,globalThis.location.origin)),t.close(),o.close()}),{once:!0}),t.start(),self.postMessage({[a]:{monoCmd:"preload",port:o}},[o])})(),await qe.afterConfigLoaded.promise,function(){const e=qe.config;e.assets||Ke(!1,"config.assets must be defined");for(const t of e.assets)ae(t),re[t.behavior]&&Z.push(t)}(),setTimeout((async()=>{try{await ue()}catch(e){at(1,e)}}),0);const e=wt(),t=await Promise.all(e);return await yt(t),Qe}():async function(){var e;await Le(Qe),fe();const t=wt();await P(),async function(){try{const e=le("dotnetwasm");await he(e),e&&e.pendingDownloadInternal&&e.pendingDownloadInternal.response||Ke(!1,"Can't load dotnet.native.wasm");const t=await e.pendingDownloadInternal.response,o=t.headers&&t.headers.get?t.headers.get("Content-Type"):void 0;let n;if("function"==typeof WebAssembly.compileStreaming&&"application/wasm"===o)n=await WebAssembly.compileStreaming(t);else{We&&"application/wasm"!==o&&w('WebAssembly resource does not have the expected content type "application/wasm", so falling back to slower ArrayBuffer instantiation.');const e=await t.arrayBuffer();qe.diagnosticTracing&&h("instantiate_wasm_module buffered"),n=Be?await Promise.resolve(new WebAssembly.Module(e)):await WebAssembly.compile(e)}e.pendingDownloadInternal=null,e.pendingDownload=null,e.buffer=null,e.moduleExports=null,qe.wasmCompilePromise.promise_control.resolve(n)}catch(e){qe.wasmCompilePromise.promise_control.reject(e)}}(),setTimeout((async()=>{try{$(),await ue()}catch(e){at(1,e)}}),0);const o=await Promise.all(t);return await yt(o),await Fe.dotnetReady.promise,await xe(null===(e=qe.config.resources)||void 0===e?void 0:e.modulesAfterRuntimeReady),await Ae("onRuntimeReady",[Ye.api]),Ge}()}function wt(){const e=le("js-module-runtime"),t=le("js-module-native");return ft&&mt||("object"==typeof e.moduleExports?ft=e.moduleExports:(qe.diagnosticTracing&&h(`Attempting to import '${e.resolvedUrl}' for ${e.name}`),ft=import(/*! webpackIgnore: true */e.resolvedUrl)),"object"==typeof t.moduleExports?mt=t.moduleExports:(qe.diagnosticTracing&&h(`Attempting to import '${t.resolvedUrl}' for ${t.name}`),mt=import(/*! webpackIgnore: true */t.resolvedUrl))),[ft,mt]}async function yt(e){const{initializeExports:t,initializeReplacements:o,configureRuntimeStartup:n,configureEmscriptenStartup:r,configureWorkerStartup:i,setRuntimeGlobals:s,passEmscriptenInternals:a}=e[0],{default:l}=e[1];if(s(Ye),t(Ye),"hybrid"===qe.config.globalizationMode){const e=await async function(){let e;const t=le("js-module-globalization");return"object"==typeof t.moduleExports?e=t.moduleExports:(h(`Attempting to import '${t.resolvedUrl}' for ${t.name}`),e=import(/*! webpackIgnore: true */t.resolvedUrl)),await e}(),{initHybrid:t}=e;t(Ve,Fe)}await n(Qe),qe.runtimeModuleLoaded.promise_control.resolve(),l((e=>(Object.assign(Qe,{ready:e.ready,__dotnet_runtime:{initializeReplacements:o,configureEmscriptenStartup:r,configureWorkerStartup:i,passEmscriptenInternals:a}}),Qe))).catch((e=>{if(e.message&&e.message.toLowerCase().includes("out of memory"))throw new Error(".NET runtime has failed to start, because too much memory was requested. Please decrease the memory by adjusting EmccMaximumHeapSize. See also https://aka.ms/dotnet-wasm-features");throw e}))}const vt=new class{withModuleConfig(e){try{return ke(Qe,e),this}catch(e){throw at(1,e),e}}withOnConfigLoaded(e){try{return ke(Qe,{onConfigLoaded:e}),this}catch(e){throw at(1,e),e}}withConsoleForwarding(){try{return De(Ze,{forwardConsoleLogsToWS:!0}),this}catch(e){throw at(1,e),e}}withExitOnUnhandledError(){try{return De(Ze,{exitOnUnhandledError:!0}),ot(),this}catch(e){throw at(1,e),e}}withAsyncFlushOnExit(){try{return De(Ze,{asyncFlushOnExit:!0}),this}catch(e){throw at(1,e),e}}withExitCodeLogging(){try{return De(Ze,{logExitCode:!0}),this}catch(e){throw at(1,e),e}}withElementOnExit(){try{return De(Ze,{appendElementOnExit:!0}),this}catch(e){throw at(1,e),e}}withInteropCleanupOnExit(){try{return De(Ze,{interopCleanupOnExit:!0}),this}catch(e){throw at(1,e),e}}withDumpThreadsOnNonZeroExit(){try{return De(Ze,{dumpThreadsOnNonZeroExit:!0}),this}catch(e){throw at(1,e),e}}withWaitingForDebugger(e){try{return De(Ze,{waitForDebugger:e}),this}catch(e){throw at(1,e),e}}withInterpreterPgo(e,t){try{return De(Ze,{interpreterPgo:e,interpreterPgoSaveDelay:t}),Ze.runtimeOptions?Ze.runtimeOptions.push("--interp-pgo-recording"):Ze.runtimeOptions=["--interp-pgo-recording"],this}catch(e){throw at(1,e),e}}withConfig(e){try{return De(Ze,e),this}catch(e){throw at(1,e),e}}withConfigSrc(e){try{return e&&"string"==typeof e||Ke(!1,"must be file path or URL"),ke(Qe,{configSrc:e}),this}catch(e){throw at(1,e),e}}withVirtualWorkingDirectory(e){try{return e&&"string"==typeof e||Ke(!1,"must be directory path"),De(Ze,{virtualWorkingDirectory:e}),this}catch(e){throw at(1,e),e}}withEnvironmentVariable(e,t){try{const o={};return o[e]=t,De(Ze,{environmentVariables:o}),this}catch(e){throw at(1,e),e}}withEnvironmentVariables(e){try{return e&&"object"==typeof e||Ke(!1,"must be dictionary object"),De(Ze,{environmentVariables:e}),this}catch(e){throw at(1,e),e}}withDiagnosticTracing(e){try{return"boolean"!=typeof e&&Ke(!1,"must be boolean"),De(Ze,{diagnosticTracing:e}),this}catch(e){throw at(1,e),e}}withDebugging(e){try{return null!=e&&"number"==typeof e||Ke(!1,"must be number"),De(Ze,{debugLevel:e}),this}catch(e){throw at(1,e),e}}withApplicationArguments(...e){try{return e&&Array.isArray(e)||Ke(!1,"must be array of strings"),De(Ze,{applicationArguments:e}),this}catch(e){throw at(1,e),e}}withRuntimeOptions(e){try{return e&&Array.isArray(e)||Ke(!1,"must be array of strings"),Ze.runtimeOptions?Ze.runtimeOptions.push(...e):Ze.runtimeOptions=e,this}catch(e){throw at(1,e),e}}withMainAssembly(e){try{return De(Ze,{mainAssemblyName:e}),this}catch(e){throw at(1,e),e}}withApplicationArgumentsFromQuery(){try{if(!globalThis.window)throw new Error("Missing window to the query parameters from");if(void 0===globalThis.URLSearchParams)throw new Error("URLSearchParams is supported");const e=new URLSearchParams(globalThis.window.location.search).getAll("arg");return this.withApplicationArguments(...e)}catch(e){throw at(1,e),e}}withApplicationEnvironment(e){try{return De(Ze,{applicationEnvironment:e}),this}catch(e){throw at(1,e),e}}withApplicationCulture(e){try{return De(Ze,{applicationCulture:e}),this}catch(e){throw at(1,e),e}}withResourceLoader(e){try{return qe.loadBootResource=e,this}catch(e){throw at(1,e),e}}async download(){try{await async function(){pt(Qe),await Le(Qe),fe(),await P(),$(),ue(),await qe.allDownloadsFinished.promise}()}catch(e){throw at(1,e),e}}async create(){try{return this.instance||(this.instance=await async function(){return await bt(Qe),Ye.api}()),this.instance}catch(e){throw at(1,e),e}}async run(){try{return Qe.config||Ke(!1,"Null moduleConfig.config"),this.instance||await this.create(),this.instance.runMainAndExit()}catch(e){throw at(1,e),e}}},_t=at,Et=bt;Be||"function"==typeof globalThis.URL||Ke(!1,"This browser/engine doesn't support URL API. Please use a modern version. See also https://aka.ms/dotnet-wasm-features"),"function"!=typeof globalThis.BigInt64Array&&Ke(!1,"This browser/engine doesn't support BigInt64Array API. Please use a modern version. See also https://aka.ms/dotnet-wasm-features");export{Et as default,vt as dotnet,_t as exit};
//# sourceMappingURL=dotnet.js.map


================================================
FILE: docfx/AppBundle/_framework/dotnet.native.js
================================================

var createDotnetRuntime = (() => {
  var _scriptDir = import.meta.url;
  
  return (
async function(moduleArg = {}) {

var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});if(_nativeModuleLoaded)throw new Error("Native module already loaded");_nativeModuleLoaded=true;createDotnetRuntime=Module=moduleArg(Module);var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary;if(ENVIRONMENT_IS_NODE){const{createRequire:createRequire}=await import("module");var require=createRequire(import.meta.url);var fs=require("fs");var nodePath=require("path");if(ENVIRONMENT_IS_WORKER){scriptDirectory=nodePath.dirname(scriptDirectory)+"/"}else{scriptDirectory=require("url").fileURLToPath(new URL("./",import.meta.url))}read_=(filename,binary)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);return fs.readFileSync(filename,binary?undefined:"utf8")};readBinary=filename=>{var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}return ret};readAsync=(filename,onload,onerror,binary=true)=>{filename=isFileURI(filename)?new URL(filename):nodePath.normalize(filename);fs.readFile(filename,binary?undefined:"utf8",(err,data)=>{if(err)onerror(err);else onload(binary?data.buffer:data)})};if(!Module["thisProgram"]&&process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=read}readBinary=f=>{if(typeof readbuffer=="function"){return new Uint8Array(readbuffer(f))}let data=read(f,"binary");assert(typeof data=="object");return data};readAsync=(f,onload,onerror)=>{setTimeout(()=>onload(readBinary(f)))};if(typeof clearTimeout=="undefined"){globalThis.clearTimeout=id=>{}}if(typeof setTimeout=="undefined"){globalThis.setTimeout=f=>typeof f=="function"?f():abort()}if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit=="function"){quit_=(status,toThrow)=>{setTimeout(()=>{if(!(toThrow instanceof ExitStatus)){let toLog=toThrow;if(toThrow&&typeof toThrow=="object"&&toThrow.stack){toLog=[toThrow,toThrow.stack]}err(`exiting due to exception: ${toLog}`)}quit(status)});throw toThrow}}if(typeof print!="undefined"){if(typeof console=="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!="undefined"?printErr:print}}else 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(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{read_=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=(url,onload,onerror)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(typeof atob=="undefined"){if(typeof global!="undefined"&&typeof globalThis=="undefined"){globalThis=global}globalThis.atob=function(input){var keyStr="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");do{enc1=keyStr.indexOf(input.charAt(i++));enc2=keyStr.indexOf(input.charAt(i++));enc3=keyStr.indexOf(input.charAt(i++));enc4=keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}while(i<input.length);return output}}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort(text)}}var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=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);Module["HEAPF64"]=HEAPF64=new Float64Array(b);Module["HEAP64"]=HEAP64=new BigInt64Array(b);Module["HEAPU64"]=HEAPU64=new BigUint64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function exitRuntime(){___funcs_on_exit();callRuntimeCallbacks(__ATEXIT__);FS.quit();TTY.shutdown();runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;EXITSTATUS=1;what+=". Build with -sASSERTIONS for more info.";if(runtimeInitialized){___trap()}var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);var isFileURI=filename=>filename.startsWith("file://");var wasmBinaryFile;if(Module["locateFile"]){wasmBinaryFile="dotnet.native.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}}else{if(ENVIRONMENT_IS_SHELL)wasmBinaryFile="dotnet.native.wasm";else wasmBinaryFile=new URL("dotnet.native.wasm",import.meta.url).href}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch=="function"&&!isFileURI(binaryFile)){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{if(!response["ok"]){throw`failed to load wasm binary file at '${binaryFile}'`}return response["arrayBuffer"]()}).catch(()=>getBinarySync(binaryFile))}else if(readAsync){return new Promise((resolve,reject)=>{readAsync(binaryFile,response=>resolve(new Uint8Array(response)),reject)})}}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function createWasm(){var info={"env":wasmImports,"wasi_snapshot_preview1":wasmImports};function receiveInstance(instance,module){wasmExports=instance.exports;Module["wasmExports"]=wasmExports;wasmMemory=wasmExports["memory"];updateMemoryViews();wasmTable=wasmExports["__indirect_function_table"];addOnInit(wasmExports["__wasm_call_ctors"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}function GetWindowInnerWidth(){return window.innerWidth}function GetWindowInnerHeight(){return window.innerHeight}function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var getCppExceptionTag=()=>wasmExports["__cpp_exception"];var getCppExceptionThrownObjectFromWebAssemblyException=ex=>{var unwind_header=ex.getArg(getCppExceptionTag(),0);return ___thrown_object_from_unwind_exception(unwind_header)};var withStackSave=f=>{var stack=stackSave();var ret=f();stackRestore(stack);return ret};var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf8"):undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx<endPtr){var u0=heapOrArray[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heapOrArray[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heapOrArray[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heapOrArray[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var getExceptionMessageCommon=ptr=>withStackSave(()=>{var type_addr_addr=stackAlloc(4);var message_addr_addr=stackAlloc(4);___get_exception_message(ptr,type_addr_addr,message_addr_addr);var type_addr=HEAPU32[type_addr_addr>>2];var message_addr=HEAPU32[message_addr_addr>>2];var type=UTF8ToString(type_addr);_free(type_addr);var message;if(message_addr){message=UTF8ToString(message_addr);_free(message_addr)}return[type,message]});var getExceptionMessage=ex=>{var ptr=getCppExceptionThrownObjectFromWebAssemblyException(ex);return getExceptionMessageCommon(ptr)};Module["getExceptionMessage"]=getExceptionMessage;function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr];case"i8":return HEAP8[ptr];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP64[ptr>>3];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=Module["noExitRuntime"]||false;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr]=value;break;case"i8":HEAP8[ptr]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":HEAP64[ptr>>3]=BigInt(value);break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var ___assert_fail=(condition,filename,line,func)=>{abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else if(ENVIRONMENT_IS_NODE){try{var crypto_module=require("crypto");var randomFillSync=crypto_module["randomFillSync"];if(randomFillSync){return view=>crypto_module["randomFillSync"](view)}var randomBytes=crypto_module["randomBytes"];return view=>(view.set(randomBytes(view.byteLength)),view)}catch(e){}}abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")}};var FS_stdin_getChar_buffer=[];var lengthBytesUTF8=str=>{var len=0;for(var i=0;i<str.length;++i){var c=str.charCodeAt(i);if(c<=127){len++}else if(c<=2047){len+=2}else if(c>=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(60)}try{for(var i=0;i<length;i++){stream.tty.ops.put_char(stream.tty,buffer[offset+i])}}catch(e){throw new FS.ErrnoError(29)}if(length){stream.node.timestamp=Date.now()}return i}},default_tty_ops:{get_char(tty){return FS_stdin_getChar()},put_char(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)>>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key of Object.keys(node.contents)){entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size},write(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HEAP8.buffer){canOwn=false}if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray){node.contents.set(buffer.subarray(offset,offset+length),position)}else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},allocate(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<contents.length){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}HEAP8.set(contents,ptr)}return{ptr:ptr,allocated:allocated}},msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var asyncLoad=(url,onload,onerror,noRunDep)=>{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url,arrayBuffer=>{onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},event=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={"r":0,"r+":2,"w":512|64|1,"w+":512|64|2,"a":1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{constructor(errno){this.name="ErrnoError";this.errno=errno}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev;this.readMode=292|73;this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH_FS.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count+1});current=lookup.node;if(count++>40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+="/"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat(path){return FS.stat(path,true)},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.chmod(stream.node,mode)},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.chown(stream.node,uid,gid)},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open(path,flags,mode){if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags=="string"?FS_modeStringToFlags(flags):flags;mode=typeof mode=="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path=="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1}}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},allocate(stream,offset,length){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error(`Invalid encoding type "${opts.encoding}"`)}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data=="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"});FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init(input,output,error){FS.init.initialized=true;Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit(){FS.init.initialized=false;_fflush(0);for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}},createDevice(parent,name,input,output){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open(stream){stream.seekable=false},close(stream){if(output?.buffer?.length){output(10)}},read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(29)}}if(length){stream.node.timestamp=Date.now()}return i}});return FS.mkdev(path,mode,dev)},forceLoadFile(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile(parent,name,url,canRead,canWrite){class LazyUint8Array{constructor(){this.lengthKnown=false;this.chunks=[]}get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size}stream_ops.read=(stream,buffer,offset,length,position)=>{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr:ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},varargs:undefined,get(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret},getp(){return SYSCALLS.get()},getStr(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream}};function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var ___syscall_fadvise64=(fd,offset,len,advice)=>0;function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.getp();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_statfs64(path,size,buf){try{path=SYSCALLS.getStr(path);HEAP32[buf+4>>2]=4096;HEAP32[buf+40>>2]=4096;HEAP32[buf+8>>2]=1e6;HEAP32[buf+12>>2]=5e5;HEAP32[buf+16>>2]=5e5;HEAP32[buf+20>>2]=FS.nextInode;HEAP32[buf+24>>2]=1e6;HEAP32[buf+28>>2]=42;HEAP32[buf+44>>2]=2;HEAP32[buf+36>>2]=255;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstatfs64(fd,size,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return ___syscall_statfs64(0,size,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var MAX_INT53=9007199254740992;var MIN_INT53=-9007199254740992;var bigintToI53Checked=num=>num<MIN_INT53||num>MAX_INT53?NaN:Number(num);function ___syscall_ftruncate64(fd,length){length=bigintToI53Checked(length);try{if(isNaN(length))return 61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size<cwdLengthInBytes)return-68;stringToUTF8(cwd,buf,size);return cwdLengthInBytes}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_getdents64(fd,dirp,count){try{var stream=SYSCALLS.getStreamFromFD(fd);stream.getdents||=FS.readdir(stream.path);var struct_size=280;var pos=0;var off=FS.llseek(stream,0,1);var idx=Math.floor(off/struct_size);while(idx<stream.getdents.length&&pos+struct_size<=count){var id;var type;var name=stream.getdents[idx];if(name==="."){id=stream.node.id;type=4}else if(name===".."){var lookup=FS.lookupPath(stream.path,{parent:true});id=lookup.node.id;type=4}else{var child=FS.lookupNode(stream.node,name);id=child.id;type=FS.isChrdev(child.mode)?2:FS.isDir(child.mode)?4:FS.isLink(child.mode)?10:8}HEAP64[dirp+pos>>3]=BigInt(id);HEAP64[dirp+pos+8>>3]=BigInt((idx+1)*struct_size);HEAP16[dirp+pos+16>>1]=280;HEAP8[dirp+pos+18]=type;stringToUTF8(name,dirp+pos+19,256);pos+=struct_size;idx+=1}FS.llseek(stream,idx*struct_size,0);return pos}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(op){case 21509:{if(!stream.tty)return-59;return 0}case 21505:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcgets){var termios=stream.tty.ops.ioctl_tcgets(stream);var argp=SYSCALLS.getp();HEAP32[argp>>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=SYSCALLS.getp();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag:c_iflag,c_oflag:c_oflag,c_cflag:c_cflag,c_lflag:c_lflag,c_cc:c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=SYSCALLS.getp();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21531:{var argp=SYSCALLS.getp();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=SYSCALLS.getp();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.lstat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.getStr(path);var nofollow=flags&256;var allowEmpty=flags&4096;flags=flags&~6400;path=SYSCALLS.calculateAt(dirfd,path,allowEmpty);return SYSCALLS.doStat(nofollow?FS.lstat:FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?SYSCALLS.get():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);return SYSCALLS.doStat(FS.stat,path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(flags===0){FS.unlink(path)}else if(flags===512){FS.rmdir(path)}else{abort("Invalid flags passed to unlinkat")}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var nowIsMonotonic=1;var __emscripten_get_now_is_monotonic=()=>nowIsMonotonic;var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function __mmap_js(len,prot,flags,fd,offset,allocated,addr){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset){offset=bigintToI53Checked(offset);try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);if(summerOffset<winterOffset){stringToUTF8(winterName,std_name,7);stringToUTF8(summerName,dst_name,7)}else{stringToUTF8(winterName,dst_name,7);stringToUTF8(summerName,std_name,7)}};var _abort=()=>{abort("")};var _emscripten_date_now=()=>Date.now();var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;if(!keepRuntimeAlive()){exitRuntime()}_proc_exit(status)};var _exit=exitJS;var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var _emscripten_force_exit=status=>{__emscripten_runtime_keepalive_clear();_exit(status)};Module["_emscripten_force_exit"]=_emscripten_force_exit;var JSEvents={removeAllEventListeners(){while(JSEvents.eventHandlers.length){JSEvents._removeHandler(JSEvents.eventHandlers.length-1)}JSEvents.deferredCalls=[]},registerRemoveEventListeners(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},inEventHandler:0,deferredCalls:[],deferCall(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort((x,y)=>x.precedence<y.precedence)},removeDeferredCalls(targetFunction){for(var i=0;i<JSEvents.deferredCalls.length;++i){if(JSEvents.deferredCalls[i].targetFunction==targetFunction){JSEvents.deferredCalls.splice(i,1);--i}}},canPerformEventHandlerRequests(){if(navigator.userActivation){return navigator.userActivation.isActive}return JSEvents.inEventHandler&&JSEvents.currentEventHandler.allowsDeferredCalls},runDeferredCalls(){if(!JSEvents.canPerformEventHandlerRequests()){return}for(var i=0;i<JSEvents.deferredCalls.length;++i){var call=JSEvents.deferredCalls[i];JSEvents.deferredCalls.splice(i,1);--i;call.targetFunction(...call.argsList)}},eventHandlers:[],removeAllHandlersOnTarget:(target,eventTypeString)=>{for(var i=0;i<JSEvents.eventHandlers.length;++i){if(JSEvents.eventHandlers[i].target==target&&(!eventTypeString||eventTypeString==JSEvents.eventHandlers[i].eventTypeString)){JSEvents._removeHandler(i--)}}},_removeHandler(i){var h=JSEvents.eventHandlers[i];h.target.removeEventListener(h.eventTypeString,h.eventListenerFunc,h.useCapture);JSEvents.eventHandlers.splice(i,1)},registerOrRemoveHandler(eventHandler){if(!eventHandler.target){return-4}if(eventHandler.callbackfunc){eventHandler.eventListenerFunc=function(event){++JSEvents.inEventHandler;JSEvents.currentEventHandler=eventHandler;JSEvents.runDeferredCalls();eventHandler.handlerFunc(event);JSEvents.runDeferredCalls();--JSEvents.inEventHandler};eventHandler.target.addEventListener(eventHandler.eventTypeString,eventHandler.eventListenerFunc,eventHandler.useCapture);JSEvents.eventHandlers.push(eventHandler);JSEvents.registerRemoveEventListeners()}else{for(var i=0;i<JSEvents.eventHandlers.length;++i){if(JSEvents.eventHandlers[i].target==eventHandler.target&&JSEvents.eventHandlers[i].eventTypeString==eventHandler.eventTypeString){JSEvents._removeHandler(i--)}}}return 0},getNodeNameForTarget(target){if(!target)return"";if(target==window)return"#window";if(target==screen)return"#screen";return target?.nodeName||""},fullscreenEnabled(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};var maybeCStringToJsString=cString=>cString>2?UTF8ToString(cString):cString;var specialHTMLTargets=[0,typeof document!="undefined"?document:0,typeof window!="undefined"?window:0];var findEventTarget=target=>{target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!="undefined"?document.querySelector(target):undefined);return domElement};var getBoundingClientRect=e=>specialHTMLTargets.indexOf(e)<0?e.getBoundingClientRect():{"left":0,"top":0};var _emscripten_get_element_css_size=(target,width,height)=>{target=findEventTarget(target);if(!target)return-4;var rect=getBoundingClientRect(target);HEAPF64[width>>3]=rect.width;HEAPF64[height>>3]=rect.height;return 0};var fillGamepadEventData=(eventStruct,e)=>{HEAPF64[eventStruct>>3]=e.timestamp;for(var i=0;i<e.axes.length;++i){HEAPF64[eventStruct+i*8+16>>3]=e.axes[i]}for(var i=0;i<e.buttons.length;++i){if(typeof e.buttons[i]=="object"){HEAPF64[eventStruct+i*8+528>>3]=e.buttons[i].value}else{HEAPF64[eventStruct+i*8+528>>3]=e.buttons[i]}}for(var i=0;i<e.buttons.length;++i){if(typeof e.buttons[i]=="object"){HEAP32[eventStruct+i*4+1040>>2]=e.buttons[i].pressed}else{HEAP32[eventStruct+i*4+1040>>2]=e.buttons[i]==1}}HEAP32[eventStruct+1296>>2]=e.connected;HEAP32[eventStruct+1300>>2]=e.index;HEAP32[eventStruct+8>>2]=e.axes.length;HEAP32[eventStruct+12>>2]=e.buttons.length;stringToUTF8(e.id,eventStruct+1304,64);stringToUTF8(e.mapping,eventStruct+1368,64)};var _emscripten_get_gamepad_status=(index,gamepadState)=>{if(index<0||index>=JSEvents.lastGamepadState.length)return-5;if(!JSEvents.lastGamepadState[index])return-7;fillGamepadEventData(gamepadState,JSEvents.lastGamepadState[index]);return 0};var getHeapMax=()=>2147483648;var _emscripten_get_heap_max=()=>getHeapMax();var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var _emscripten_get_now_res=()=>{if(ENVIRONMENT_IS_NODE){return 1}return 1e3};var _emscripten_get_num_gamepads=()=>JSEvents.lastGamepadState.length;var webgl_enable_ANGLE_instanced_arrays=ctx=>{var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=(index,divisor)=>ext["vertexAttribDivisorANGLE"](index,divisor);ctx["drawArraysInstanced"]=(mode,first,count,primcount)=>ext["drawArraysInstancedANGLE"](mode,first,count,primcount);ctx["drawElementsInstanced"]=(mode,count,type,indices,primcount)=>ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount);return 1}};var webgl_enable_OES_vertex_array_object=ctx=>{var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=()=>ext["createVertexArrayOES"]();ctx["deleteVertexArray"]=vao=>ext["deleteVertexArrayOES"](vao);ctx["bindVertexArray"]=vao=>ext["bindVertexArrayOES"](vao);ctx["isVertexArray"]=vao=>ext["isVertexArrayOES"](vao);return 1}};var webgl_enable_WEBGL_draw_buffers=ctx=>{var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=(n,bufs)=>ext["drawBuffersWEBGL"](n,bufs);return 1}};var webgl_enable_WEBGL_multi_draw=ctx=>!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"));var getEmscriptenSupportedExtensions=ctx=>{var supportedExtensions=["ANGLE_instanced_arrays","EXT_blend_minmax","EXT_disjoint_timer_query","EXT_frag_depth","EXT_shader_texture_lod","EXT_sRGB","OES_element_index_uint","OES_fbo_render_mipmap","OES_standard_derivatives","OES_texture_float","OES_texture_half_float","OES_texture_half_float_linear","OES_vertex_array_object","WEBGL_color_buffer_float","WEBGL_depth_texture","WEBGL_draw_buffers","EXT_color_buffer_half_float","EXT_depth_clamp","EXT_float_blend","EXT_texture_compression_bptc","EXT_texture_compression_rgtc","EXT_texture_filter_anisotropic","KHR_parallel_shader_compile","OES_texture_float_linear","WEBGL_blend_func_extended","WEBGL_compressed_texture_astc","WEBGL_compressed_texture_etc","WEBGL_compressed_texture_etc1","WEBGL_compressed_texture_s3tc","WEBGL_compressed_texture_s3tc_srgb","WEBGL_debug_renderer_info","WEBGL_debug_shaders","WEBGL_lose_context","WEBGL_multi_draw"];return(ctx.getSupportedExtensions()||[]).filter(ext=>supportedExtensions.includes(ext))};var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,recordError:errorCode=>{if(!GL.lastError){GL.lastError=errorCode}},getNewId:table=>{var ret=GL.counter++;for(var i=table.length;i<ret;i++){table[i]=null}return ret},genObject:(n,buffers,createFunction,objectTable)=>{for(var i=0;i<n;i++){var buffer=GLctx[createFunction]();var id=buffer&&GL.getNewId(objectTable);if(buffer){buffer.name=id;objectTable[id]=buffer}else{GL.recordError(1282)}HEAP32[buffers+i*4>>2]=id}},getSource:(shader,count,string,length)=>{var source="";for(var i=0;i<count;++i){var len=length?HEAPU32[length+i*4>>2]:undefined;source+=UTF8ToString(HEAPU32[string+i*4>>2],len)}return source},createContext:(canvas,webGLContextAttributes)=>{if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:(ctx,webGLContextAttributes)=>{var handle=GL.getNewId(GL.contexts);var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:contextHandle=>{GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext?.GLctx;return!(contextHandle&&!GLctx)},getContext:contextHandle=>GL.contexts[contextHandle],deleteContext:contextHandle=>{if(GL.currentContext===GL.contexts[contextHandle]){GL.currentContext=null}if(typeof JSEvents=="object"){JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas)}if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas){GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined}GL.contexts[contextHandle]=null},initExtensions:context=>{context||=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;webgl_enable_ANGLE_instanced_arrays(GLctx);webgl_enable_OES_vertex_array_object(GLctx);webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}webgl_enable_WEBGL_multi_draw(GLctx);getEmscriptenSupportedExtensions(GLctx).forEach(ext=>{if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}})}};var _glActiveTexture=x0=>GLctx.activeTexture(x0);var _emscripten_glActiveTexture=_glActiveTexture;var _glAttachShader=(program,shader)=>{GLctx.attachShader(GL.programs[program],GL.shaders[shader])};var _emscripten_glAttachShader=_glAttachShader;var _glBeginQueryEXT=(target,id)=>{GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.queries[id])};var _emscripten_glBeginQueryEXT=_glBeginQueryEXT;var _glBindAttribLocation=(program,index,name)=>{GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))};var _emscripten_glBindAttribLocation=_glBindAttribLocation;var _glBindBuffer=(target,buffer)=>{GLctx.bindBuffer(target,GL.buffers[buffer])};var _emscripten_glBindBuffer=_glBindBuffer;var _glBindFramebuffer=(target,framebuffer)=>{GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])};var _emscripten_glBindFramebuffer=_glBindFramebuffer;var _glBindRenderbuffer=(target,renderbuffer)=>{GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])};var _emscripten_glBindRenderbuffer=_glBindRenderbuffer;var _glBindTexture=(target,texture)=>{GLctx.bindTexture(target,GL.textures[texture])};var _emscripten_glBindTexture=_glBindTexture;var _glBindVertexArray=vao=>{GLctx.bindVertexArray(GL.vaos[vao])};var _glBindVertexArrayOES=_glBindVertexArray;var _emscripten_glBindVertexArrayOES=_glBindVertexArrayOES;var _glBlendColor=(x0,x1,x2,x3)=>GLctx.blendColor(x0,x1,x2,x3);var _emscripten_glBlendColor=_glBlendColor;var _glBlendEquation=x0=>GLctx.blendEquation(x0);var _emscripten_glBlendEquation=_glBlendEquation;var _glBlendEquationSeparate=(x0,x1)=>GLctx.blendEquationSeparate(x0,x1);var _emscripten_glBlendEquationSeparate=_glBlendEquationSeparate;var _glBlendFunc=(x0,x1)=>GLctx.blendFunc(x0,x1);var _emscripten_glBlendFunc=_glBlendFunc;var _glBlendFuncSeparate=(x0,x1,x2,x3)=>GLctx.blendFuncSeparate(x0,x1,x2,x3);var _emscripten_glBlendFuncSeparate=_glBlendFuncSeparate;var _glBufferData=(target,size,data,usage)=>{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)};var _emscripten_glBufferData=_glBufferData;var _glBufferSubData=(target,offset,size,data)=>{GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))};var _emscripten_glBufferSubData=_glBufferSubData;var _glCheckFramebufferStatus=x0=>GLctx.checkFramebufferStatus(x0);var _emscripten_glCheckFramebufferStatus=_glCheckFramebufferStatus;var _glClear=x0=>GLctx.clear(x0);var _emscripten_glClear=_glClear;var _glClearColor=(x0,x1,x2,x3)=>GLctx.clearColor(x0,x1,x2,x3);var _emscripten_glClearColor=_glClearColor;var _glClearDepthf=x0=>GLctx.clearDepth(x0);var _emscripten_glClearDepthf=_glClearDepthf;var _glClearStencil=x0=>GLctx.clearStencil(x0);var _emscripten_glClearStencil=_glClearStencil;var _glColorMask=(red,green,blue,alpha)=>{GLctx.colorMask(!!red,!!green,!!blue,!!alpha)};var _emscripten_glColorMask=_glColorMask;var _glCompileShader=shader=>{GLctx.compileShader(GL.shaders[shader])};var _emscripten_glCompileShader=_glCompileShader;var _glCompressedTexImage2D=(target,level,internalFormat,width,height,border,imageSize,data)=>{GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,data?HEAPU8.subarray(data,data+imageSize):null)};var _emscripten_glCompressedTexImage2D=_glCompressedTexImage2D;var _glCompressedTexSubImage2D=(target,level,xoffset,yoffset,width,height,format,imageSize,data)=>{GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,data?HEAPU8.subarray(data,data+imageSize):null)};var _emscripten_glCompressedTexSubImage2D=_glCompressedTexSubImage2D;var _glCopyTexImage2D=(x0,x1,x2,x3,x4,x5,x6,x7)=>GLctx.copyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7);var _emscripten_glCopyTexImage2D=_glCopyTexImage2D;var _glCopyTexSubImage2D=(x0,x1,x2,x3,x4,x5,x6,x7)=>GLctx.copyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7);var _emscripten_glCopyTexSubImage2D=_glCopyTexSubImage2D;var _glCreateProgram=()=>{var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id};var _emscripten_glCreateProgram=_glCreateProgram;var _glCreateShader=shaderType=>{var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id};var _emscripten_glCreateShader=_glCreateShader;var _glCullFace=x0=>GLctx.cullFace(x0);var _emscripten_glCullFace=_glCullFace;var _glDeleteBuffers=(n,buffers)=>{for(var i=0;i<n;i++){var id=HEAP32[buffers+i*4>>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null}};var _emscripten_glDeleteBuffers=_glDeleteBuffers;var _glDeleteFramebuffers=(n,framebuffers)=>{for(var i=0;i<n;++i){var id=HEAP32[framebuffers+i*4>>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}};var _emscripten_glDeleteFramebuffers=_glDeleteFramebuffers;var _glDeleteProgram=id=>{if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null};var _emscripten_glDeleteProgram=_glDeleteProgram;var _glDeleteQueriesEXT=(n,ids)=>{for(var i=0;i<n;i++){var id=HEAP32[ids+i*4>>2];var query=GL.queries[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.queries[id]=null}};var _emscripten_glDeleteQueriesEXT=_glDeleteQueriesEXT;var _glDeleteRenderbuffers=(n,renderbuffers)=>{for(var i=0;i<n;i++){var id=HEAP32[renderbuffers+i*4>>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}};var _emscripten_glDeleteRenderbuffers=_glDeleteRenderbuffers;var _glDeleteShader=id=>{if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null};var _emscripten_glDeleteShader=_glDeleteShader;var _glDeleteTextures=(n,textures)=>{for(var i=0;i<n;i++){var id=HEAP32[textures+i*4>>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}};var _emscripten_glDeleteTextures=_glDeleteTextures;var _glDeleteVertexArrays=(n,vaos)=>{for(var i=0;i<n;i++){var id=HEAP32[vaos+i*4>>2];GLctx.deleteVertexArray(GL.vaos[id]);GL.vaos[id]=null}};var _glDeleteVertexArraysOES=_glDeleteVertexArrays;var _emscripten_glDeleteVertexArraysOES=_glDeleteVertexArraysOES;var _glDepthFunc=x0=>GLctx.depthFunc(x0);var _emscripten_glDepthFunc=_glDepthFunc;var _glDepthMask=flag=>{GLctx.depthMask(!!flag)};var _emscripten_glDepthMask=_glDepthMask;var _glDepthRangef=(x0,x1)=>GLctx.depthRange(x0,x1);var _emscripten_glDepthRangef=_glDepthRangef;var _glDetachShader=(program,shader)=>{GLctx.detachShader(GL.programs[program],GL.shaders[shader])};var _emscripten_glDetachShader=_glDetachShader;var _glDisable=x0=>GLctx.disable(x0);var _emscripten_glDisable=_glDisable;var _glDisableVertexAttribArray=index=>{GLctx.disableVertexAttribArray(index)};var _emscripten_glDisableVertexAttribArray=_glDisableVertexAttribArray;var _glDrawArrays=(mode,first,count)=>{GLctx.drawArrays(mode,first,count)};var _emscripten_glDrawArrays=_glDrawArrays;var _glDrawArraysInstanced=(mode,first,count,primcount)=>{GLctx.drawArraysInstanced(mode,first,count,primcount)};var _glDrawArraysInstancedANGLE=_glDrawArraysInstanced;var _emscripten_glDrawArraysInstancedANGLE=_glDrawArraysInstancedANGLE;var tempFixedLengthArray=[];var _glDrawBuffers=(n,bufs)=>{var bufArray=tempFixedLengthArray[n];for(var i=0;i<n;i++){bufArray[i]=HEAP32[bufs+i*4>>2]}GLctx.drawBuffers(bufArray)};var _glDrawBuffersWEBGL=_glDrawBuffers;var _emscripten_glDrawBuffersWEBGL=_glDrawBuffersWEBGL;var _glDrawElements=(mode,count,type,indices)=>{GLctx.drawElements(mode,count,type,indices)};var _emscripten_glDrawElements=_glDrawElements;var _glDrawElementsInstanced=(mode,count,type,indices,primcount)=>{GLctx.drawElementsInstanced(mode,count,type,indices,primcount)};var _glDrawElementsInstancedANGLE=_glDrawElementsInstanced;var _emscripten_glDrawElementsInstancedANGLE=_glDrawElementsInstancedANGLE;var _glEnable=x0=>GLctx.enable(x0);var _emscripten_glEnable=_glEnable;var _glEnableVertexAttribArray=index=>{GLctx.enableVertexAttribArray(index)};var _emscripten_glEnableVertexAttribArray=_glEnableVertexAttribArray;var _glEndQueryEXT=target=>{GLctx.disjointTimerQueryExt["endQueryEXT"](target)};var _emscripten_glEndQueryEXT=_glEndQueryEXT;var _glFinish=()=>GLctx.finish();var _emscripten_glFinish=_glFinish;var _glFlush=()=>GLctx.flush();var _emscripten_glFlush=_glFlush;var _glFramebufferRenderbuffer=(target,attachment,renderbuffertarget,renderbuffer)=>{GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])};var _emscripten_glFramebufferRenderbuffer=_glFramebufferRenderbuffer;var _glFramebufferTexture2D=(target,attachment,textarget,texture,level)=>{GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)};var _emscripten_glFramebufferTexture2D=_glFramebufferTexture2D;var _glFrontFace=x0=>GLctx.frontFace(x0);var _emscripten_glFrontFace=_glFrontFace;var _glGenBuffers=(n,buffers)=>{GL.genObject(n,buffers,"createBuffer",GL.buffers)};var _emscripten_glGenBuffers=_glGenBuffers;var _glGenFramebuffers=(n,ids)=>{GL.genObject(n,ids,"createFramebuffer",GL.framebuffers)};var _emscripten_glGenFramebuffers=_glGenFramebuffers;var _glGenQueriesEXT=(n,ids)=>{for(var i=0;i<n;i++){var query=GLctx.disjointTimerQueryExt["createQueryEXT"]();if(!query){GL.recordError(1282);while(i<n)HEAP32[ids+i++*4>>2]=0;return}var id=GL.getNewId(GL.queries);query.name=id;GL.queries[id]=query;HEAP32[ids+i*4>>2]=id}};var _emscripten_glGenQueriesEXT=_glGenQueriesEXT;var _glGenRenderbuffers=(n,renderbuffers)=>{GL.genObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)};var _emscripten_glGenRenderbuffers=_glGenRenderbuffers;var _glGenTextures=(n,textures)=>{GL.genObject(n,textures,"createTexture",GL.textures)};var _emscripten_glGenTextures=_glGenTextures;var _glGenVertexArrays=(n,arrays)=>{GL.genObject(n,arrays,"createVertexArray",GL.vaos)};var _glGenVertexArraysOES=_glGenVertexArrays;var _emscripten_glGenVertexArraysOES=_glGenVertexArraysOES;var _glGenerateMipmap=x0=>GLctx.generateMipmap(x0);var _emscripten_glGenerateMipmap=_glGenerateMipmap;var __glGetActiveAttribOrUniform=(funcName,program,index,bufSize,length,size,type,name)=>{program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull;if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}};var _glGetActiveAttrib=(program,index,bufSize,length,size,type,name)=>{__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name)};var _emscripten_glGetActiveAttrib=_glGetActiveAttrib;var _glGetActiveUniform=(program,index,bufSize,length,size,type,name)=>{__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name)};var _emscripten_glGetActiveUniform=_glGetActiveUniform;var _glGetAttachedShaders=(program,maxCount,count,shaders)=>{var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>2]=len;for(var i=0;i<len;++i){var id=GL.shaders.indexOf(result[i]);HEAP32[shaders+i*4>>2]=id}};var _emscripten_glGetAttachedShaders=_glGetAttachedShaders;var _glGetAttribLocation=(program,name)=>GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name));var _emscripten_glGetAttribLocation=_glGetAttribLocation;var writeI53ToI64=(ptr,num)=>{HEAPU32[ptr>>2]=num;var lower=HEAPU32[ptr>>2];HEAPU32[ptr+4>>2]=(num-lower)/4294967296};var emscriptenWebGLGet=(name_,p,type)=>{if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i<result.length;++i){switch(type){case 0:HEAP32[p+i*4>>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Unknown object returned from WebGL getParameter(${name_})! (error: ${e})`);return}}break;default:GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Native code calling glGet${type}v(${name_}) and it returns ${result} of type ${typeof result}!`);return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p]=ret?1:0;break}};var _glGetBooleanv=(name_,p)=>emscriptenWebGLGet(name_,p,4);var _emscripten_glGetBooleanv=_glGetBooleanv;var _glGetBufferParameteriv=(target,value,data)=>{if(!data){GL.recordError(1281);return}HEAP32[data>>2]=GLctx.getBufferParameter(target,value)};var _emscripten_glGetBufferParameteriv=_glGetBufferParameteriv;var _glGetError=()=>{var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error};var _emscripten_glGetError=_glGetError;var _glGetFloatv=(name_,p)=>emscriptenWebGLGet(name_,p,2);var _emscripten_glGetFloatv=_glGetFloatv;var _glGetFramebufferAttachmentParameteriv=(target,attachment,pname,params)=>{var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result};var _emscripten_glGetFramebufferAttachmentParameteriv=_glGetFramebufferAttachmentParameteriv;var _glGetIntegerv=(name_,p)=>emscriptenWebGLGet(name_,p,0);var _emscripten_glGetIntegerv=_glGetIntegerv;var _glGetProgramInfoLog=(program,maxLength,length,infoLog)=>{var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _emscripten_glGetProgramInfoLog=_glGetProgramInfoLog;var _glGetProgramiv=(program,pname,p)=>{if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){for(var i=0;i<GLctx.getProgramParameter(program,35718);++i){program.maxUniformLength=Math.max(program.maxUniformLength,GLctx.getActiveUniform(program,i).name.length+1)}}HEAP32[p>>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){for(var i=0;i<GLctx.getProgramParameter(program,35721);++i){program.maxAttributeLength=Math.max(program.maxAttributeLength,GLctx.getActiveAttrib(program,i).name.length+1)}}HEAP32[p>>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){for(var i=0;i<GLctx.getProgramParameter(program,35382);++i){program.maxUniformBlockNameLength=Math.max(program.maxUniformBlockNameLength,GLctx.getActiveUniformBlockName(program,i).length+1)}}HEAP32[p>>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}};var _emscripten_glGetProgramiv=_glGetProgramiv;var _glGetQueryObjecti64vEXT=(id,pname,params)=>{if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;{param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)};var _emscripten_glGetQueryObjecti64vEXT=_glGetQueryObjecti64vEXT;var _glGetQueryObjectivEXT=(id,pname,params)=>{if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret};var _emscripten_glGetQueryObjectivEXT=_glGetQueryObjectivEXT;var _glGetQueryObjectui64vEXT=_glGetQueryObjecti64vEXT;var _emscripten_glGetQueryObjectui64vEXT=_glGetQueryObjectui64vEXT;var _glGetQueryObjectuivEXT=_glGetQueryObjectivEXT;var _emscripten_glGetQueryObjectuivEXT=_glGetQueryObjectuivEXT;var _glGetQueryivEXT=(target,pname,params)=>{if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)};var _emscripten_glGetQueryivEXT=_glGetQueryivEXT;var _glGetRenderbufferParameteriv=(target,pname,params)=>{if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getRenderbufferParameter(target,pname)};var _emscripten_glGetRenderbufferParameteriv=_glGetRenderbufferParameteriv;var _glGetShaderInfoLog=(shader,maxLength,length,infoLog)=>{var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _emscripten_glGetShaderInfoLog=_glGetShaderInfoLog;var _glGetShaderPrecisionFormat=(shaderType,precisionType,range,precision)=>{var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>2]=result.rangeMin;HEAP32[range+4>>2]=result.rangeMax;HEAP32[precision>>2]=result.precision};var _emscripten_glGetShaderPrecisionFormat=_glGetShaderPrecisionFormat;var _glGetShaderSource=(shader,bufSize,length,source)=>{var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _emscripten_glGetShaderSource=_glGetShaderSource;var _glGetShaderiv=(shader,pname,p)=>{if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}};var _emscripten_glGetShaderiv=_glGetShaderiv;var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var webglGetExtensions=function $webglGetExtensions(){var exts=getEmscriptenSupportedExtensions(GLctx);exts=exts.concat(exts.map(e=>"GL_"+e));return exts};var _glGetString=name_=>{var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:ret=stringToNewUTF8(webglGetExtensions().join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s?stringToNewUTF8(s):0;break;case 7938:var glVersion=GLctx.getParameter(7938);{glVersion=`OpenGL ES 2.0 (${glVersion})`}ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion=`OpenGL ES GLSL ES ${ver_num[1]} (${glslVersion})`}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret};var _emscripten_glGetString=_glGetString;var _glGetTexParameterfv=(target,pname,params)=>{if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx.getTexParameter(target,pname)};var _emscripten_glGetTexParameterfv=_glGetTexParameterfv;var _glGetTexParameteriv=(target,pname,params)=>{if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getTexParameter(target,pname)};var _emscripten_glGetTexParameteriv=_glGetTexParameteriv;var jstoi_q=str=>parseInt(str);var webglGetLeftBracePos=name=>name.slice(-1)=="]"&&name.lastIndexOf("[");var webglPrepareUniformLocationsBeforeFirstUse=program=>{var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};for(i=0;i<GLctx.getProgramParameter(program,35718);++i){var u=GLctx.getActiveUniform(program,i);var nm=u.name;var sz=u.size;var lb=webglGetLeftBracePos(nm);var arrayName=lb>0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j<sz;++j){uniformLocsById[id]=j;program.uniformArrayNamesById[id++]=arrayName}}}};var _glGetUniformLocation=(program,name)=>{name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex<sizeAndId[0]){arrayIndex+=sizeAndId[1];if(uniformLocsById[arrayIndex]=uniformLocsById[arrayIndex]||GLctx.getUniformLocation(program,name)){return arrayIndex}}}else{GL.recordError(1281)}return-1};var _emscripten_glGetUniformLocation=_glGetUniformLocation;var webglGetUniformLocation=location=>{var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?`[${webglLoc}]`:""))}return webglLoc}else{GL.recordError(1282)}};var emscriptenWebGLGetUniform=(program,location,params,type)=>{if(!params){GL.recordError(1281);return}program=GL.programs[program];webglPrepareUniformLocationsBeforeFirstUse(program);var data=GLctx.getUniform(program,webglGetUniformLocation(location));if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break}}else{for(var i=0;i<data.length;i++){switch(type){case 0:HEAP32[params+i*4>>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break}}}};var _glGetUniformfv=(program,location,params)=>{emscriptenWebGLGetUniform(program,location,params,2)};var _emscripten_glGetUniformfv=_glGetUniformfv;var _glGetUniformiv=(program,location,params)=>{emscriptenWebGLGetUniform(program,location,params,0)};var _emscripten_glGetUniformiv=_glGetUniformiv;var _glGetVertexAttribPointerv=(index,pname,pointer)=>{if(!pointer){GL.recordError(1281);return}HEAP32[pointer>>2]=GLctx.getVertexAttribOffset(index,pname)};var _emscripten_glGetVertexAttribPointerv=_glGetVertexAttribPointerv;var emscriptenWebGLGetVertexAttrib=(index,pname,params,type)=>{if(!params){GL.recordError(1281);return}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){HEAP32[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break;case 5:HEAP32[params>>2]=Math.fround(data);break}}else{for(var i=0;i<data.length;i++){switch(type){case 0:HEAP32[params+i*4>>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break;case 5:HEAP32[params+i*4>>2]=Math.fround(data[i]);break}}}};var _glGetVertexAttribfv=(index,pname,params)=>{emscriptenWebGLGetVertexAttrib(index,pname,params,2)};var _emscripten_glGetVertexAttribfv=_glGetVertexAttribfv;var _glGetVertexAttribiv=(index,pname,params)=>{emscriptenWebGLGetVertexAttrib(index,pname,params,5)};var _emscripten_glGetVertexAttribiv=_glGetVertexAttribiv;var _glHint=(x0,x1)=>GLctx.hint(x0,x1);var _emscripten_glHint=_glHint;var _glIsBuffer=buffer=>{var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)};var _emscripten_glIsBuffer=_glIsBuffer;var _glIsEnabled=x0=>GLctx.isEnabled(x0);var _emscripten_glIsEnabled=_glIsEnabled;var _glIsFramebuffer=framebuffer=>{var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)};var _emscripten_glIsFramebuffer=_glIsFramebuffer;var _glIsProgram=program=>{program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)};var _emscripten_glIsProgram=_glIsProgram;var _glIsQueryEXT=id=>{var query=GL.queries[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)};var _emscripten_glIsQueryEXT=_glIsQueryEXT;var _glIsRenderbuffer=renderbuffer=>{var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)};var _emscripten_glIsRenderbuffer=_glIsRenderbuffer;var _glIsShader=shader=>{var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)};var _emscripten_glIsShader=_glIsShader;var _glIsTexture=id=>{var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)};var _emscripten_glIsTexture=_glIsTexture;var _glIsVertexArray=array=>{var vao=GL.vaos[array];if(!vao)return 0;return GLctx.isVertexArray(vao)};var _glIsVertexArrayOES=_glIsVertexArray;var _emscripten_glIsVertexArrayOES=_glIsVertexArrayOES;var _glLineWidth=x0=>GLctx.lineWidth(x0);var _emscripten_glLineWidth=_glLineWidth;var _glLinkProgram=program=>{program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}};var _emscripten_glLinkProgram=_glLinkProgram;var _glPixelStorei=(pname,param)=>{if(pname==3317){GL.unpackAlignment=param}GLctx.pixelStorei(pname,param)};var _emscripten_glPixelStorei=_glPixelStorei;var _glPolygonOffset=(x0,x1)=>GLctx.polygonOffset(x0,x1);var _emscripten_glPolygonOffset=_glPolygonOffset;var _glQueryCounterEXT=(id,target)=>{GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.queries[id],target)};var _emscripten_glQueryCounterEXT=_glQueryCounterEXT;var computeUnpackAlignedImageSize=(width,height,sizePerPixel,alignment)=>{function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=width*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,alignment);return height*alignedRowSize};var colorChannelsInGlTextureFormat=format=>{var colorChannels={5:3,6:4,8:2,29502:3,29504:4};return colorChannels[format-6402]||1};var heapObjectForWebGLType=type=>{type-=5120;if(type==1)return HEAPU8;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922)return HEAPU32;return HEAPU16};var toTypedArrayIndex=(pointer,heap)=>pointer>>>31-Math.clz32(heap.BYTES_PER_ELEMENT);var emscriptenWebGLGetTexPixelData=(type,format,width,height,pixels,internalFormat)=>{var heap=heapObjectForWebGLType(type);var sizePerPixel=colorChannelsInGlTextureFormat(format)*heap.BYTES_PER_ELEMENT;var bytes=computeUnpackAlignedImageSize(width,height,sizePerPixel,GL.unpackAlignment);return heap.subarray(toTypedArrayIndex(pixels,heap),toTypedArrayIndex(pixels+bytes,heap))};var _glReadPixels=(x,y,width,height,format,type,pixels)=>{var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)};var _emscripten_glReadPixels=_glReadPixels;var _glReleaseShaderCompiler=()=>{};var _emscripten_glReleaseShaderCompiler=_glReleaseShaderCompiler;var _glRenderbufferStorage=(x0,x1,x2,x3)=>GLctx.renderbufferStorage(x0,x1,x2,x3);var _emscripten_glRenderbufferStorage=_glRenderbufferStorage;var _glSampleCoverage=(value,invert)=>{GLctx.sampleCoverage(value,!!invert)};var _emscripten_glSampleCoverage=_glSampleCoverage;var _glScissor=(x0,x1,x2,x3)=>GLctx.scissor(x0,x1,x2,x3);var _emscripten_glScissor=_glScissor;var _glShaderBinary=(count,shaders,binaryformat,binary,length)=>{GL.recordError(1280)};var _emscripten_glShaderBinary=_glShaderBinary;var _glShaderSource=(shader,count,string,length)=>{var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)};var _emscripten_glShaderSource=_glShaderSource;var _glStencilFunc=(x0,x1,x2)=>GLctx.stencilFunc(x0,x1,x2);var _emscripten_glStencilFunc=_glStencilFunc;var _glStencilFuncSeparate=(x0,x1,x2,x3)=>GLctx.stencilFuncSeparate(x0,x1,x2,x3);var _emscripten_glStencilFuncSeparate=_glStencilFuncSeparate;var _glStencilMask=x0=>GLctx.stencilMask(x0);var _emscripten_glStencilMask=_glStencilMask;var _glStencilMaskSeparate=(x0,x1)=>GLctx.stencilMaskSeparate(x0,x1);var _emscripten_glStencilMaskSeparate=_glStencilMaskSeparate;var _glStencilOp=(x0,x1,x2)=>GLctx.stencilOp(x0,x1,x2);var _emscripten_glStencilOp=_glStencilOp;var _glStencilOpSeparate=(x0,x1,x2,x3)=>GLctx.stencilOpSeparate(x0,x1,x2,x3);var _emscripten_glStencilOpSeparate=_glStencilOpSeparate;var _glTexImage2D=(target,level,internalFormat,width,height,border,format,type,pixels)=>{var pixelData=pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null;GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixelData)};var _emscripten_glTexImage2D=_glTexImage2D;var _glTexParameterf=(x0,x1,x2)=>GLctx.texParameterf(x0,x1,x2);var _emscripten_glTexParameterf=_glTexParameterf;var _glTexParameterfv=(target,pname,params)=>{var param=HEAPF32[params>>2];GLctx.texParameterf(target,pname,param)};var _emscripten_glTexParameterfv=_glTexParameterfv;var _glTexParameteri=(x0,x1,x2)=>GLctx.texParameteri(x0,x1,x2);var _emscripten_glTexParameteri=_glTexParameteri;var _glTexParameteriv=(target,pname,params)=>{var param=HEAP32[params>>2];GLctx.texParameteri(target,pname,param)};var _emscripten_glTexParameteriv=_glTexParameteriv;var _glTexSubImage2D=(target,level,xoffset,yoffset,width,height,format,type,pixels)=>{var pixelData=pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0):null;GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)};var _emscripten_glTexSubImage2D=_glTexSubImage2D;var _glUniform1f=(location,v0)=>{GLctx.uniform1f(webglGetUniformLocation(location),v0)};var _emscripten_glUniform1f=_glUniform1f;var miniTempWebGLFloatBuffers=[];var _glUniform1fv=(location,count,value)=>{if(count<=288){var view=miniTempWebGLFloatBuffers[count-1];for(var i=0;i<count;++i){view[i]=HEAPF32[value+4*i>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform1fv=_glUniform1fv;var _glUniform1i=(location,v0)=>{GLctx.uniform1i(webglGetUniformLocation(location),v0)};var _emscripten_glUniform1i=_glUniform1i;var miniTempWebGLIntBuffers=[];var _glUniform1iv=(location,count,value)=>{if(count<=288){var view=miniTempWebGLIntBuffers[count-1];for(var i=0;i<count;++i){view[i]=HEAP32[value+4*i>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform1iv=_glUniform1iv;var _glUniform2f=(location,v0,v1)=>{GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)};var _emscripten_glUniform2f=_glUniform2f;var _glUniform2fv=(location,count,value)=>{if(count<=144){var view=miniTempWebGLFloatBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform2fv=_glUniform2fv;var _glUniform2i=(location,v0,v1)=>{GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)};var _emscripten_glUniform2i=_glUniform2i;var _glUniform2iv=(location,count,value)=>{if(count<=144){var view=miniTempWebGLIntBuffers[2*count-1];for(var i=0;i<2*count;i+=2){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform2iv=_glUniform2iv;var _glUniform3f=(location,v0,v1,v2)=>{GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)};var _emscripten_glUniform3f=_glUniform3f;var _glUniform3fv=(location,count,value)=>{if(count<=96){var view=miniTempWebGLFloatBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform3fv=_glUniform3fv;var _glUniform3i=(location,v0,v1,v2)=>{GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)};var _emscripten_glUniform3i=_glUniform3i;var _glUniform3iv=(location,count,value)=>{if(count<=96){var view=miniTempWebGLIntBuffers[3*count-1];for(var i=0;i<3*count;i+=3){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform3iv=_glUniform3iv;var _glUniform4f=(location,v0,v1,v2,v3)=>{GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)};var _emscripten_glUniform4f=_glUniform4f;var _glUniform4fv=(location,count,value)=>{if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];var heap=HEAPF32;value=value>>2;for(var i=0;i<4*count;i+=4){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform4fv=_glUniform4fv;var _glUniform4i=(location,v0,v1,v2,v3)=>{GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)};var _emscripten_glUniform4i=_glUniform4i;var _glUniform4iv=(location,count,value)=>{if(count<=72){var view=miniTempWebGLIntBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAP32[value+4*i>>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform4iv=_glUniform4iv;var _glUniformMatrix2fv=(location,count,transpose,value)=>{if(count<=72){var view=miniTempWebGLFloatBuffers[4*count-1];for(var i=0;i<4*count;i+=4){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)};var _emscripten_glUniformMatrix2fv=_glUniformMatrix2fv;var _glUniformMatrix3fv=(location,count,transpose,value)=>{if(count<=32){var view=miniTempWebGLFloatBuffers[9*count-1];for(var i=0;i<9*count;i+=9){view[i]=HEAPF32[value+4*i>>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)};var _emscripten_glUniformMatrix3fv=_glUniformMatrix3fv;var _glUniformMatrix4fv=(location,count,transpose,value)=>{if(count<=18){var view=miniTempWebGLFloatBuffers[16*count-1];var heap=HEAPF32;value=value>>2;for(var i=0;i<16*count;i+=16){var dst=value+i;view[i]=heap[dst];view[i+1]=heap[dst+1];view[i+2]=heap[dst+2];view[i+3]=heap[dst+3];view[i+4]=heap[dst+4];view[i+5]=heap[dst+5];view[i+6]=heap[dst+6];view[i+7]=heap[dst+7];view[i+8]=heap[dst+8];view[i+9]=heap[dst+9];view[i+10]=heap[dst+10];view[i+11]=heap[dst+11];view[i+12]=heap[dst+12];view[i+13]=heap[dst+13];view[i+14]=heap[dst+14];view[i+15]=heap[dst+15]}}else{var view=HEAPF32.subarray(value>>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)};var _emscripten_glUniformMatrix4fv=_glUniformMatrix4fv;var _glUseProgram=program=>{program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program};var _emscripten_glUseProgram=_glUseProgram;var _glValidateProgram=program=>{GLctx.validateProgram(GL.programs[program])};var _emscripten_glValidateProgram=_glValidateProgram;var _glVertexAttrib1f=(x0,x1)=>GLctx.vertexAttrib1f(x0,x1);var _emscripten_glVertexAttrib1f=_glVertexAttrib1f;var _glVertexAttrib1fv=(index,v)=>{GLctx.vertexAttrib1f(index,HEAPF32[v>>2])};var _emscripten_glVertexAttrib1fv=_glVertexAttrib1fv;var _glVertexAttrib2f=(x0,x1,x2)=>GLctx.vertexAttrib2f(x0,x1,x2);var _emscripten_glVertexAttrib2f=_glVertexAttrib2f;var _glVertexAttrib2fv=(index,v)=>{GLctx.vertexAttrib2f(index,HEAPF32[v>>2],HEAPF32[v+4>>2])};var _emscripten_glVertexAttrib2fv=_glVertexAttrib2fv;var _glVertexAttrib3f=(x0,x1,x2,x3)=>GLctx.vertexAttrib3f(x0,x1,x2,x3);var _emscripten_glVertexAttrib3f=_glVertexAttrib3f;var _glVertexAttrib3fv=(index,v)=>{GLctx.vertexAttrib3f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2])};var _emscripten_glVertexAttrib3fv=_glVertexAttrib3fv;var _glVertexAttrib4f=(x0,x1,x2,x3,x4)=>GLctx.vertexAttrib4f(x0,x1,x2,x3,x4);var _emscripten_glVertexAttrib4f=_glVertexAttrib4f;var _glVertexAttrib4fv=(index,v)=>{GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])};var _emscripten_glVertexAttrib4fv=_glVertexAttrib4fv;var _glVertexAttribDivisor=(index,divisor)=>{GLctx.vertexAttribDivisor(index,divisor)};var _glVertexAttribDivisorANGLE=_glVertexAttribDivisor;var _emscripten_glVertexAttribDivisorANGLE=_glVertexAttribDivisorANGLE;var _glVertexAttribPointer=(index,size,type,normalized,stride,ptr)=>{GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)};var _emscripten_glVertexAttribPointer=_glVertexAttribPointer;var _glViewport=(x0,x1,x2,x3)=>GLctx.viewport(x0,x1,x2,x3);var _emscripten_glViewport=_glViewport;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;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}var alignUp=(x,multiple)=>x+(multiple-x%multiple)%multiple;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,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var _emscripten_sample_gamepad_data=()=>{try{if(navigator.getGamepads)return(JSEvents.lastGamepadState=navigator.getGamepads())?0:-1}catch(e){navigator.getGamepads=null}return-1};var findCanvasEventTarget=findEventTarget;var _emscripten_set_canvas_element_size=(target,width,height)=>{var canvas=findCanvasEventTarget(target);if(!canvas)return-4;canvas.width=width;canvas.height=height;return 0};var fillMouseEventData=(eventStruct,e,target)=>{HEAPF64[eventStruct>>3]=e.timeStamp;var idx=eventStruct>>2;HEAP32[idx+2]=e.screenX;HEAP32[idx+3]=e.screenY;HEAP32[idx+4]=e.clientX;HEAP32[idx+5]=e.clientY;HEAP32[idx+6]=e.ctrlKey;HEAP32[idx+7]=e.shiftKey;HEAP32[idx+8]=e.altKey;HEAP32[idx+9]=e.metaKey;HEAP16[idx*2+20]=e.button;HEAP16[idx*2+21]=e.buttons;HEAP32[idx+11]=e["movementX"];HEAP32[idx+12]=e["movementY"];var rect=getBoundingClientRect(target);HEAP32[idx+13]=e.clientX-(rect.left|0);HEAP32[idx+14]=e.clientY-(rect.top|0)};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 registerMouseEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.mouseEvent)JSEvents.mouseEvent=_malloc(72);target=findEventTarget(target);var mouseEventHandlerFunc=(e=event)=>{fillMouseEventData(JSEvents.mouseEvent,e,target);if(getWasmTableEntry(callbackfunc)(eventTypeId,JSEvents.mouseEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString!="mousemove"&&eventTypeString!="mouseenter"&&eventTypeString!="mouseleave",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:mouseEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_click_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,4,"click",targetThread);var fillFullscreenChangeEventData=eventStruct=>{var fullscreenElement=document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement;var isFullscreen=!!fullscreenElement;HEAP32[eventStruct>>2]=isFullscreen;HEAP32[eventStruct+4>>2]=JSEvents.fullscreenEnabled();var reportedElement=isFullscreen?fullscreenElement:JSEvents.previousFullscreenElement;var nodeName=JSEvents.getNodeNameForTarget(reportedElement);var id=reportedElement?.id||"";stringToUTF8(nodeName,eventStruct+8,128);stringToUTF8(id,eventStruct+136,128);HEAP32[eventStruct+264>>2]=reportedElement?reportedElement.clientWidth:0;HEAP32[eventStruct+268>>2]=reportedElement?reportedElement.clientHeight:0;HEAP32[eventStruct+272>>2]=screen.width;HEAP32[eventStruct+276>>2]=screen.height;if(isFullscreen){JSEvents.previousFullscreenElement=fullscreenElement}};var registerFullscreenChangeEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.fullscreenChangeEvent)JSEvents.fullscreenChangeEvent=_malloc(280);var fullscreenChangeEventhandlerFunc=(e=event)=>{var fullscreenChangeEvent=JSEvents.fullscreenChangeEvent;fillFullscreenChangeEventData(fullscreenChangeEvent);if(getWasmTableEntry(callbackfunc)(eventTypeId,fullscreenChangeEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:fullscreenChangeEventhandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_fullscreenchange_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{if(!JSEvents.fullscreenEnabled())return-1;target=findEventTarget(target);if(!target)return-4;registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"webkitfullscreenchange",targetThread);return registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"fullscreenchange",targetThread)};var registerGamepadEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.gamepadEvent)JSEvents.gamepadEvent=_malloc(1432);var gamepadEventHandlerFunc=(e=event)=>{var gamepadEvent=JSEvents.gamepadEvent;fillGamepadEventData(gamepadEvent,e["gamepad"]);if(getWasmTableEntry(callbackfunc)(eventTypeId,gamepadEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:gamepadEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_gamepadconnected_callback_on_thread=(userData,useCapture,callbackfunc,targetThread)=>{if(_emscripten_sample_gamepad_data())return-1;return registerGamepadEventCallback(2,userData,useCapture,callbackfunc,26,"gamepadconnected",targetThread)};var _emscripten_set_gamepaddisconnected_callback_on_thread=(userData,useCapture,callbackfunc,targetThread)=>{if(_emscripten_sample_gamepad_data())return-1;return registerGamepadEventCallback(2,userData,useCapture,callbackfunc,27,"gamepaddisconnected",targetThread)};var registerUiEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.uiEvent)JSEvents.uiEvent=_malloc(36);target=findEventTarget(target);var uiEventHandlerFunc=(e=event)=>{if(e.target!=target){return}var b=document.body;if(!b){return}var uiEvent=JSEvents.uiEvent;HEAP32[uiEvent>>2]=0;HEAP32[uiEvent+4>>2]=b.clientWidth;HEAP32[uiEvent+8>>2]=b.clientHeight;HEAP32[uiEvent+12>>2]=innerWidth;HEAP32[uiEvent+16>>2]=innerHeight;HEAP32[uiEvent+20>>2]=outerWidth;HEAP32[uiEvent+24>>2]=outerHeight;HEAP32[uiEvent+28>>2]=pageXOffset|0;HEAP32[uiEvent+32>>2]=pageYOffset|0;if(getWasmTableEntry(callbackfunc)(eventTypeId,uiEvent,userData))e.preventDefault()};var eventHandler={target:target,eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:uiEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_resize_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerUiEventCallback(target,userData,useCapture,callbackfunc,10,"resize",targetThread);var registerTouchEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{if(!JSEvents.touchEvent)JSEvents.touchEvent=_malloc(1696);target=findEventTarget(target);var touchEventHandlerFunc=e=>{var t,touches={},et=e.touches;for(var i=0;i<et.length;++i){t=et[i];t.isChanged=t.onTarget=0;touches[t.identifier]=t}for(var i=0;i<e.changedTouches.length;++i){t=e.changedTouches[i];t.isChanged=1;touches[t.identifier]=t}for(var i=0;i<e.targetTouches.length;++i){touches[e.targetTouches[i].identifier].onTarget=1}var touchEvent=JSEvents.touchEvent;HEAPF64[touchEvent>>3]=e.timeStamp;var idx=touchEvent>>2;HEAP32[idx+3]=e.ctrlKey;HEAP32[idx+4]=e.shiftKey;HEAP32[idx+5]=e.altKey;HEAP32[idx+6]=e.metaKey;idx+=7;var targetRect=getBoundingClientRect(target);var numTouches=0;for(var i in touches){t=touches[i];HEAP32[idx+0]=t.identifier;HEAP32[idx+1]=t.screenX;HEAP32[idx+2]=t.screenY;HEAP32[idx+3]=t.clientX;HEAP32[idx+4]=t.clientY;HEAP32[idx+5]=t.pageX;HEAP32[idx+6]=t.pageY;HEAP32[idx+7]=t.isChanged;HEAP32[idx+8]=t.onTarget;HEAP32[idx+9]=t.clientX-(targetRect.left|0);HEAP32[idx+10]=t.clientY-(targetRect.top|0);idx+=13;if(++numTouches>31){break}}HEAP32[touchEvent+8>>2]=numTouches;if(getWasmTableEntry(callbackfunc)(eventTypeId,touchEvent,userData))e.preventDefault()};var eventHandler={target:target,allowsDeferredCalls:eventTypeString=="touchstart"||eventTypeString=="touchend",eventTypeString:eventTypeString,callbackfunc:callbackfunc,handlerFunc:touchEventHandlerFunc,useCapture:useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_touchcancel_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,25,"touchcancel",targetThread);var _emscripten_set_touchend_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,23,"touchend",targetThread);var _emscripten_set_touchmove_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,24,"touchmove",targetThread);var _emscripten_set_touchstart_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,22,"touchstart",targetThread);var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};var _emscripten_set_main_loop_timing=(mode,value)=>{Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(!Browser.mainLoop.running){runtimeKeepalivePush();Browser.mainLoop.running=true}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,Browser.mainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(Browser.mainLoop.runner,timeUntilNextTick)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(typeof Browser.setImmediate=="undefined"){if(typeof setImmediate=="undefined"){var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var Browser_setImmediate_messageHandler=event=>{if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",Browser_setImmediate_messageHandler,true);Browser.setImmediate=function Browser_emulated_setImmediate(func){setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){if(Module["setImmediates"]===undefined)Module["setImmediates"]=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}else{Browser.setImmediate=setImmediate}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){Browser.setImmediate(Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var maybeExit=()=>{if(runtimeExited){return}if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var setMainLoop=(browserIterationFunc,fps,simulateInfiniteLoop,arg,noSetTiming)=>{Browser.mainLoop.func=browserIterationFunc;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId<Browser.mainLoop.currentlyRunningMainloop){runtimeKeepalivePop();maybeExit();return false}return true}Browser.mainLoop.running=false;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}Browser.mainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(Browser.mainLoop.runner,0);return}if(!checkIsRunning())return;Browser.mainLoop.currentFrameNumber=Browser.mainLoop.currentFrameNumber+1|0;if(Browser.mainLoop.timingMode==1&&Browser.mainLoop.timingValue>1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}else if(Browser.mainLoop.timingMode==0){Browser.mainLoop.tickStartTime=_emscripten_get_now()}Browser.mainLoop.runIter(browserIterationFunc);if(!checkIsRunning())return;if(typeof SDL=="object")SDL.audio?.queueNewAudioData?.();Browser.mainLoop.scheduler()};if(!noSetTiming){if(fps&&fps>0){_emscripten_set_main_loop_timing(0,1e3/fps)}else{_emscripten_set_main_loop_timing(1,1)}Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}};var callUserCallback=func=>{if(runtimeExited||ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var safeSetTimeout=(func,timeout)=>{runtimeKeepalivePush();return setTimeout(()=>{runtimeKeepalivePop();callUserCallback(func)},timeout)};var warnOnce=text=>{warnOnce.shown||={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}};var Browser={mainLoop:{running:false,scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++},resume(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;setMainLoop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()},updateStatus(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining<expected){Module["setStatus"](`{message} ({expected - remaining}/{expected})`)}else{Module["setStatus"](message)}}else{Module["setStatus"]("")}}},runIter(func){if(ABORT)return;if(Module["preMainLoop"]){var preRet=Module["preMainLoop"]();if(preRet===false){return}}callUserCallback(func);Module["postMainLoop"]?.()}},isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],init(){if(Browser.initted)return;Browser.initted=true;var imagePlugin={};imagePlugin["canHandle"]=function imagePlugin_canHandle(name){return!Module.noImageDecoding&&/\.(jpg|jpeg|png|bmp)$/i.test(name)};imagePlugin["handle"]=function imagePlugin_handle(byteArray,name,onload,onerror){var b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([new Uint8Array(byteArray).buffer],{type:Browser.getMimetype(name)})}var url=URL.createObjectURL(b);var img=new Image;img.onload=()=>{var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);preloadedImages[name]=canvas;URL.revokeObjectURL(url);onload?.(byteArray)};img.onerror=event=>{err(`Image ${url} could not be decoded`);onerror?.()};img.src=url};preloadPlugins.push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=function audioPlugin_canHandle(name){return!Module.noAudioDecoding&&name.substr(-4)in{".ogg":1,".wav":1,".mp3":1}};audioPlugin["handle"]=function audioPlugin_handle(byteArray,name,onload,onerror){var done=false;function finish(audio){if(done)return;done=true;preloadedAudios[name]=audio;onload?.(byteArray)}var b=new Blob([byteArray],{type:Browser.getMimetype(name)});var url=URL.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",()=>finish(audio),false);audio.onerror=function audio_onerror(event){if(done)return;err(`warning: browser could not fully decode audio ${name}, trying slower base64 approach`);function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i<data.length;i++){leftchar=leftchar<<8|data[i];leftbits+=8;while(leftbits>=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout(()=>{finish(audio)},1e4)};preloadPlugins.push(audioPlugin);function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===Module["canvas"]||document["mozPointerLockElement"]===Module["canvas"]||document["webkitPointerLockElement"]===Module["canvas"]||document["msPointerLockElement"]===Module["canvas"]}var canvas=Module["canvas"];if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(()=>{});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(()=>{});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",ev=>{if(!Browser.pointerLock&&Module["canvas"].requestPointerLock){Module["canvas"].requestPointerLock();ev.preventDefault()}},false)}}},createContext(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(callback=>callback());Browser.init()}return ctx},destroyContext(canvas,useWebGL,setInModule){},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Module["canvas"];function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if((document["fullscreenElement"]||document["mozFullScreenElement"]||document["msFullscreenElement"]||document["webkitFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}Module["onFullScreen"]?.(Browser.isFullscreen);Module["onFullscreen"]?.(Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscr
Download .txt
gitextract_pvwrcex8/

├── .github/
│   ├── ISSUE_TEMPLATE/
│   │   └── issue.md
│   └── workflows/
│       ├── build-demo.yml
│       ├── deploy-docs.yml
│       ├── deterministic-hash.yml
│       ├── jitter-tests.yml
│       ├── publish.yml
│       └── test-deploy-docs.yml
├── LICENSE
├── README.md
├── docfx/
│   ├── .gitignore
│   ├── AppBundle/
│   │   ├── WebDemo.runtimeconfig.json
│   │   ├── _framework/
│   │   │   ├── Jitter2.wasm
│   │   │   ├── Raylib-cs.wasm
│   │   │   ├── System.Collections.wasm
│   │   │   ├── System.Private.CoreLib.wasm
│   │   │   ├── System.Runtime.InteropServices.JavaScript.wasm
│   │   │   ├── WebDemo.wasm
│   │   │   ├── blazor.boot.json
│   │   │   ├── dotnet.js
│   │   │   ├── dotnet.native.js
│   │   │   ├── dotnet.native.wasm
│   │   │   ├── dotnet.runtime.js
│   │   │   └── supportFiles/
│   │   │       ├── 0_JetBrainsMono-LICENSE.txt
│   │   │       ├── 2_lighting.fs
│   │   │       └── 3_lighting.vs
│   │   ├── index.html
│   │   ├── main.js
│   │   └── package.json
│   ├── docfx.json
│   ├── docs/
│   │   ├── changelog.md
│   │   ├── documentation/
│   │   │   ├── arbiters.md
│   │   │   ├── bodies.md
│   │   │   ├── constraints.md
│   │   │   ├── dynamictree.md
│   │   │   ├── filters.md
│   │   │   ├── general.md
│   │   │   ├── images/
│   │   │   │   └── dynamictree.odp
│   │   │   ├── shapes.md
│   │   │   └── world.md
│   │   ├── introduction.md
│   │   ├── toc.yml
│   │   └── tutorials/
│   │       ├── boxes/
│   │       │   ├── hello-world.md
│   │       │   ├── project-setup.md
│   │       │   └── render-loop.md
│   │       └── teapots/
│   │           ├── aftermath.md
│   │           ├── hello-world.md
│   │           ├── hull-sampling.md
│   │           └── project-setup.md
│   ├── index.md
│   ├── run.sh
│   ├── template/
│   │   └── public/
│   │       └── main.js
│   └── toc.yml
├── other/
│   ├── ContactClipping/
│   │   ├── ClipDebug.cs
│   │   ├── JitterClipVisualizer.csproj
│   │   └── Program.cs
│   ├── GodotDemo/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── JitterGodot.csproj
│   │   ├── JitterGodot.sln
│   │   ├── Program.cs
│   │   ├── README.md
│   │   ├── assets/
│   │   │   ├── box.png.import
│   │   │   └── floor.png.import
│   │   ├── box.material
│   │   ├── icon.svg.import
│   │   ├── main_scene.tscn
│   │   └── project.godot
│   ├── GodotSoftBodies/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── JitterGodot.csproj
│   │   ├── JitterGodot.sln
│   │   ├── Program.cs
│   │   ├── README.md
│   │   ├── assets/
│   │   │   └── texture_08.png.import
│   │   ├── box.material
│   │   ├── icon.svg.import
│   │   ├── main_scene.tscn
│   │   └── project.godot
│   └── WebDemo/
│       ├── LICENSE
│       ├── Program.cs
│       ├── Properties/
│       │   ├── AssemblyInfo.cs
│       │   └── launchSettings.json
│       ├── README.md
│       ├── RLights.cs
│       ├── WebDemo.csproj
│       ├── assets/
│       │   ├── JetBrainsMono-LICENSE.txt
│       │   ├── lighting.fs
│       │   └── lighting.vs
│       ├── index.html
│       ├── main.js
│       ├── run
│       ├── runtimeconfig.template.json
│       └── runtimes/
│           └── raylib.a
├── src/
│   ├── .gitignore
│   ├── Jitter2/
│   │   ├── Attributes.cs
│   │   ├── Collision/
│   │   │   ├── CollisionFilter/
│   │   │   │   ├── IBroadPhaseFilter.cs
│   │   │   │   ├── INarrowPhaseFilter.cs
│   │   │   │   └── TriangleEdgeCollisionFilter.cs
│   │   │   ├── CollisionIsland.cs
│   │   │   ├── DynamicTree/
│   │   │   │   ├── DynamicTree.FindNearest.cs
│   │   │   │   ├── DynamicTree.RayCast.cs
│   │   │   │   ├── DynamicTree.SweepCast.cs
│   │   │   │   ├── DynamicTree.cs
│   │   │   │   ├── IDynamicTreeProxy.cs
│   │   │   │   └── TreeBox.cs
│   │   │   ├── IslandHelper.cs
│   │   │   ├── NarrowPhase/
│   │   │   │   ├── CollisionManifold.cs
│   │   │   │   ├── ConvexPolytope.cs
│   │   │   │   ├── ISupportMappable.cs
│   │   │   │   ├── MinkowskiDifference.cs
│   │   │   │   ├── NarrowPhase.cs
│   │   │   │   ├── SimplexSolver.cs
│   │   │   │   ├── SimplexSolverAB.cs
│   │   │   │   └── SupportPrimitives.cs
│   │   │   ├── PairHashSet.cs
│   │   │   └── Shapes/
│   │   │       ├── BoxShape.cs
│   │   │       ├── CapsuleShape.cs
│   │   │       ├── ConeShape.cs
│   │   │       ├── ConvexHullShape.cs
│   │   │       ├── CylinderShape.cs
│   │   │       ├── ICloneableShape.cs
│   │   │       ├── PointCloudShape.cs
│   │   │       ├── RigidBodyShape.cs
│   │   │       ├── Shape.cs
│   │   │       ├── ShapeHelper.cs
│   │   │       ├── SphereShape.cs
│   │   │       ├── TransformedShape.cs
│   │   │       ├── TriangleMesh.cs
│   │   │       ├── TriangleShape.cs
│   │   │       └── VertexSupportMap.cs
│   │   ├── DataStructures/
│   │   │   ├── ISink.cs
│   │   │   ├── PartitionedSet.cs
│   │   │   ├── ReadOnlyHashset.cs
│   │   │   ├── ReadOnlyList.cs
│   │   │   ├── ShardedDictionary.cs
│   │   │   ├── SlimBag.cs
│   │   │   └── SpanHelper.cs
│   │   ├── Dynamics/
│   │   │   ├── Arbiter.cs
│   │   │   ├── Constraints/
│   │   │   │   ├── AngularMotor.cs
│   │   │   │   ├── BallSocket.cs
│   │   │   │   ├── ConeLimit.cs
│   │   │   │   ├── Constraint.cs
│   │   │   │   ├── DistanceLimit.cs
│   │   │   │   ├── FixedAngle.cs
│   │   │   │   ├── HingeAngle.cs
│   │   │   │   ├── Internal/
│   │   │   │   │   └── QMatrix.cs
│   │   │   │   ├── Limit.cs
│   │   │   │   ├── LinearMotor.cs
│   │   │   │   ├── PointOnLine.cs
│   │   │   │   ├── PointOnPlane.cs
│   │   │   │   └── TwistAngle.cs
│   │   │   ├── Contact.cs
│   │   │   ├── Joints/
│   │   │   │   ├── HingeJoint.cs
│   │   │   │   ├── Joint.cs
│   │   │   │   ├── PrismaticJoint.cs
│   │   │   │   ├── UniversalJoint.cs
│   │   │   │   └── WeldJoint.cs
│   │   │   └── RigidBody.cs
│   │   ├── IDebugDrawer.cs
│   │   ├── Jitter2.csproj
│   │   ├── LinearMath/
│   │   │   ├── Interop.cs
│   │   │   ├── JAngle.cs
│   │   │   ├── JBoundingBox.cs
│   │   │   ├── JMatrix.cs
│   │   │   ├── JQuaternion.cs
│   │   │   ├── JTriangle.cs
│   │   │   ├── JVector.cs
│   │   │   ├── MathHelper.cs
│   │   │   └── StableMath.cs
│   │   ├── Logger.cs
│   │   ├── Parallelization/
│   │   │   ├── Parallel.cs
│   │   │   ├── ParallelExtensions.cs
│   │   │   ├── ReaderWriterLock.cs
│   │   │   └── ThreadPool.cs
│   │   ├── Precision.cs
│   │   ├── SoftBodies/
│   │   │   ├── BroadPhaseCollisionFilter.cs
│   │   │   ├── DynamicTreeCollisionFilter.cs
│   │   │   ├── SoftBody.cs
│   │   │   ├── SoftBodyShape.cs
│   │   │   ├── SoftBodyTetrahedron.cs
│   │   │   ├── SoftBodyTriangle.cs
│   │   │   └── SpringConstraint.cs
│   │   ├── Tracer.cs
│   │   ├── Unmanaged/
│   │   │   ├── MemoryHelper.cs
│   │   │   └── PartitionedBuffer.cs
│   │   ├── World.Detect.cs
│   │   ├── World.Deterministic.cs
│   │   ├── World.Step.cs
│   │   ├── World.cs
│   │   └── _package/
│   │       ├── LICENSE
│   │       ├── README.md
│   │       └── THIRD-PARTY-NOTICES.txt
│   ├── Jitter2.sln
│   ├── Jitter2.slnx
│   ├── JitterBenchmark/
│   │   ├── JitterBenchmark.csproj
│   │   ├── Program.cs
│   │   └── Usings.cs
│   ├── JitterDemo/
│   │   ├── ColorGenerator.cs
│   │   ├── Conversion.cs
│   │   ├── ConvexDecomposition.cs
│   │   ├── Demos/
│   │   │   ├── Car/
│   │   │   │   ├── ConstraintCar.cs
│   │   │   │   ├── RayCastCar.cs
│   │   │   │   └── Wheel.cs
│   │   │   ├── Common.cs
│   │   │   ├── Demo00.cs
│   │   │   ├── Demo01.cs
│   │   │   ├── Demo02.cs
│   │   │   ├── Demo03.cs
│   │   │   ├── Demo04.cs
│   │   │   ├── Demo05.cs
│   │   │   ├── Demo06.cs
│   │   │   ├── Demo07.cs
│   │   │   ├── Demo08.cs
│   │   │   ├── Demo09.cs
│   │   │   ├── Demo10.cs
│   │   │   ├── Demo11.cs
│   │   │   ├── Demo12.cs
│   │   │   ├── Demo13.cs
│   │   │   ├── Demo14.cs
│   │   │   ├── Demo15.cs
│   │   │   ├── Demo16.cs
│   │   │   ├── Demo17.cs
│   │   │   ├── Demo18.cs
│   │   │   ├── Demo19.cs
│   │   │   ├── Demo20.cs
│   │   │   ├── Demo21.cs
│   │   │   ├── Demo22.cs
│   │   │   ├── Demo23.cs
│   │   │   ├── Demo24.cs
│   │   │   ├── Demo25.cs
│   │   │   ├── Demo26.cs
│   │   │   ├── Demo27.cs
│   │   │   ├── Demo28.cs
│   │   │   ├── Demo29.cs
│   │   │   ├── Demo30.cs
│   │   │   ├── IDemo.cs
│   │   │   ├── Misc/
│   │   │   │   ├── CcdSolver.cs
│   │   │   │   ├── GearCoupling.cs
│   │   │   │   ├── Octree.cs
│   │   │   │   └── Player.cs
│   │   │   └── SoftBody/
│   │   │       ├── PressurizedSphere.cs
│   │   │       ├── SoftBodyCloth.cs
│   │   │       └── SoftBodyCube.cs
│   │   ├── JitterDemo.csproj
│   │   ├── Playground.Debug.cs
│   │   ├── Playground.Gui.cs
│   │   ├── Playground.Picking.cs
│   │   ├── Playground.cs
│   │   ├── Program.cs
│   │   ├── Renderer/
│   │   │   ├── Assets/
│   │   │   │   ├── Image.cs
│   │   │   │   └── Mesh.cs
│   │   │   ├── CSM/
│   │   │   │   ├── CSMInstance.cs
│   │   │   │   ├── CSMRenderer.cs
│   │   │   │   ├── CSMShader.cs
│   │   │   │   └── Instances/
│   │   │   │       ├── Cloth.cs
│   │   │   │       ├── Cone.cs
│   │   │   │       ├── Cube.cs
│   │   │   │       ├── Cylinder.cs
│   │   │   │       ├── DebugInstance.cs
│   │   │   │       ├── Floor.cs
│   │   │   │       ├── HalfSphere.cs
│   │   │   │       ├── MultiMesh.cs
│   │   │   │       ├── Sphere.cs
│   │   │   │       ├── TestCube.cs
│   │   │   │       ├── TriangleMesh.cs
│   │   │   │       └── Tube.cs
│   │   │   ├── Camera.cs
│   │   │   ├── DearImGui/
│   │   │   │   ├── ImGui.cs
│   │   │   │   ├── ImGuiNative.cs
│   │   │   │   └── ImGuiStructs.cs
│   │   │   ├── DebugRenderer.cs
│   │   │   ├── ImGuiRenderer.cs
│   │   │   ├── ImportResolver.cs
│   │   │   ├── OpenGL/
│   │   │   │   ├── GLDebug.cs
│   │   │   │   ├── GLDevice.cs
│   │   │   │   ├── GLFWWindow.cs
│   │   │   │   ├── Input/
│   │   │   │   │   ├── Joystick.cs
│   │   │   │   │   ├── Keyboard.cs
│   │   │   │   │   └── Mouse.cs
│   │   │   │   ├── LinearMath/
│   │   │   │   │   ├── Matrix4.cs
│   │   │   │   │   ├── MatrixHelper.cs
│   │   │   │   │   ├── Vector2.cs
│   │   │   │   │   ├── Vector3.cs
│   │   │   │   │   └── Vector4.cs
│   │   │   │   ├── Native/
│   │   │   │   │   ├── GL.cs
│   │   │   │   │   └── GLFW.cs
│   │   │   │   ├── Objects/
│   │   │   │   │   ├── ArrayBuffer.cs
│   │   │   │   │   ├── ElementArrayBuffer.cs
│   │   │   │   │   ├── Framebuffer.cs
│   │   │   │   │   ├── GLBuffer.cs
│   │   │   │   │   ├── GLObject.cs
│   │   │   │   │   ├── Shader.cs
│   │   │   │   │   ├── Texture.cs
│   │   │   │   │   └── VertexArrayObject.cs
│   │   │   │   └── Uniforms.cs
│   │   │   ├── RenderWindow.cs
│   │   │   ├── Skybox.cs
│   │   │   ├── TextureOverlay.cs
│   │   │   └── VertexDefinitions.cs
│   │   ├── assets/
│   │   │   ├── car.LICENSE
│   │   │   ├── car.blend
│   │   │   ├── car.obj
│   │   │   ├── car.tga
│   │   │   ├── dragon.LICENSE
│   │   │   ├── level.LICENSE
│   │   │   ├── level.blend
│   │   │   ├── level.obj
│   │   │   ├── logo.tga
│   │   │   ├── teapot_hull.obj
│   │   │   ├── texture_10.LICENSE
│   │   │   ├── texture_10.tga
│   │   │   ├── unit.tga
│   │   │   └── wheel.obj
│   │   └── runtimes/
│   │       ├── LICENSE
│   │       ├── linux-arm64/
│   │       │   └── native/
│   │       │       └── libglfw.so.3
│   │       └── linux-x64/
│   │           └── native/
│   │               └── libglfw.so.3
│   └── JitterTests/
│       ├── Api/
│       │   ├── BoundingBoxTests.cs
│       │   ├── DynamicTreeDistanceTests.cs
│       │   ├── InertiaTests.cs
│       │   ├── InteropTests.cs
│       │   ├── MassInertiaTests.cs
│       │   ├── MathTests.cs
│       │   ├── RayTriangle.cs
│       │   ├── RigidBodyCreationTests.cs
│       │   ├── RigidBodyPropertyTests.cs
│       │   ├── SequentialTests.cs
│       │   ├── ShapeTests.cs
│       │   ├── SupportMapTests.cs
│       │   ├── UnsafeConversion.cs
│       │   └── WorldTests.cs
│       ├── Behavior/
│       │   ├── AddRemoveTests.cs
│       │   ├── BroadPhaseUpdateTests.cs
│       │   ├── CollisionFilterTests.cs
│       │   ├── CollisionTests.cs
│       │   ├── ConstraintLifecycleTests.cs
│       │   ├── ContactLifecycleTests.cs
│       │   ├── ForceImpulseTests.cs
│       │   ├── MiscTests.cs
│       │   ├── MotionTypeTests.cs
│       │   ├── NullBodyTests.cs
│       │   ├── SleepTests.cs
│       │   ├── StackingTests.cs
│       │   └── WorldCallbackTests.cs
│       ├── Constraints/
│       │   ├── AdditionalConstraintBehaviorTests.cs
│       │   ├── ConstraintSolverOutcomeTests.cs
│       │   ├── ConstraintTests.cs
│       │   └── DeterministicConstraintSolverTests.cs
│       ├── Helper.cs
│       ├── JitterTests.csproj
│       ├── Regression/
│       │   ├── CollisionManifoldTests.cs
│       │   ├── HistoricalRegressionTests.cs
│       │   └── PersistentContactManifoldSelectionTests.cs
│       ├── Robustness/
│       │   ├── DisposedWorldTests.cs
│       │   ├── LockTests.cs
│       │   ├── MotionAndPredictionTests.cs
│       │   ├── MultiThreadRobustnessTests.cs
│       │   ├── NumericEdgeCaseTests.cs
│       │   ├── ParallelTests.cs
│       │   └── ReproducibilityTest.cs
│       └── Usings.cs
└── tools/
    ├── CoACD/
    │   ├── README
    │   ├── run.py
    │   └── run.sh
    └── ImGui.NET/
        ├── CodeGenerator/
        │   ├── CSharpCodeWriter.cs
        │   ├── CodeGenerator.csproj
        │   ├── ImguiDefinitions.cs
        │   ├── Program.cs
        │   ├── TypeInfo.cs
        │   └── definitions/
        │       ├── cimgui/
        │       │   ├── definitions.json
        │       │   ├── structs_and_enums.json
        │       │   └── variants.json
        │       ├── cimguizmo/
        │       │   ├── definitions.json
        │       │   ├── structs_and_enums.json
        │       │   └── variants.json
        │       ├── cimnodes/
        │       │   ├── definitions.json
        │       │   ├── structs_and_enums.json
        │       │   └── variants.json
        │       └── cimplot/
        │           ├── definitions.json
        │           ├── structs_and_enums.json
        │           └── variants.json
        ├── LICENSE
        ├── README
        └── cimgui/
            └── mingw-w64-x86_64.cmake
Download .txt
Showing preview only (402K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4233 symbols across 253 files)

FILE: docfx/AppBundle/_framework/dotnet.js
  function r (line 3) | function r(e,t){let o=null;const r=new Promise((function(n,r){o={isDone:...
  function i (line 3) | function i(e){return e[n]}
  function s (line 3) | function s(e){e&&function(e){return void 0!==e[n]}(e)||Ke(!1,"Promise is...
  function g (line 3) | function g(e){m=e}
  function h (line 3) | function h(e){if(qe.diagnosticTracing){const t="function"==typeof e?e():...
  function p (line 3) | function p(e,...t){console.info(c+e,...t)}
  function b (line 3) | function b(e,...t){console.info(e,...t)}
  function w (line 3) | function w(e,...t){console.warn(c+e,...t)}
  function y (line 3) | function y(e,...t){if(t&&t.length>0&&t[0]&&"object"==typeof t[0]){if(t[0...
  function v (line 3) | function v(e,t,o){return function(...n){try{let r=n[0];if(void 0===r)r="...
  function _ (line 3) | function _(e,t,o){d=t,m=e,f={...t};const n=`${o}/console`.replace("https...
  function E (line 3) | function E(e){let t=30;const o=()=>{u?0==u.bufferedAmount||0==t?(e&&b(e)...
  function T (line 3) | function T(e){u&&u.readyState===WebSocket.OPEN?u.send(e):f.log(e)}
  function R (line 3) | function R(e){f.error(`[${m}] proxy console websocket error: ${e}`,e)}
  function j (line 3) | function j(e){f.debug(`[${m}] proxy console websocket closed: ${e}`,e)}
  function C (line 3) | function C(){const e=Object.values(S),t=Object.values(A),o=L(e),n=L(t),r...
  function I (line 3) | async function I(){const e=O;if(e){const t=(await e.keys()).map((async t...
  function M (line 3) | function M(e){return`${e.resolvedUrl}.${e.hash}`}
  function P (line 3) | async function P(){O=await async function(e){if(!qe.config.cacheBootReso...
  function L (line 3) | function L(e){return e.reduce(((e,t)=>e+(t.responseBytes||0)),0)}
  function U (line 3) | function U(e){return`${(e/1048576).toFixed(2)} MB`}
  function $ (line 3) | function $(){qe.preferredIcuAsset=N(qe.config);let e="invariant"==qe.con...
  function N (line 3) | function N(e){var t;if((null===(t=e.resources)||void 0===t?void 0:t.icu)...
  method constructor (line 3) | constructor(e){this.url=e}
  method toString (line 3) | toString(){return this.url}
  function W (line 3) | async function W(e,t){try{const o="function"==typeof globalThis.fetch;if...
  function B (line 3) | function B(e){return"string"!=typeof e&&Ke(!1,"url must be a string"),!q...
  function q (line 3) | function q(e){return Ue||Be?e.startsWith("/")||e.startsWith("\\")||-1!==...
  function ie (line 3) | function ie(e){return!("icu"==e.behavior&&e.name!=qe.preferredIcuAsset)}
  function se (line 3) | function se(e,t,o){const n=Object.keys(t||{});Ke(1==n.length,`Expect to ...
  function ae (line 3) | function ae(e){X[e.behavior]&&Q.set(e.behavior,e)}
  function le (line 3) | function le(e){const t=function(e){Ke(X[e],`Unknown single asset behavio...
  function ue (line 3) | async function ue(){if(!ce){ce=!0,qe.diagnosticTracing&&h("mono_download...
  function fe (line 3) | function fe(){if(de)return;de=!0;const e=qe.config,t=[];if(e.assets)for(...
  function me (line 3) | function me(e){var t;const o=null===(t=qe.config.resources)||void 0===t?...
  function ge (line 3) | async function ge(e){const t=await he(e);return await t.pendingDownloadI...
  function he (line 3) | async function he(e){try{return await pe(e)}catch(t){if(!qe.enableDownlo...
  function pe (line 3) | async function pe(e){for(;G;)await G.promise;try{++H,H==qe.maxParallelDo...
  function be (line 3) | function be(e,t){let o;return null==t&&Ke(!1,`sourcePrefix must be provi...
  function we (line 3) | function we(e,t){return qe.modulesUniqueQuery&&ee[t]&&(e+=qe.modulesUniq...
  function _e (line 3) | function _e(e){try{e.resolvedUrl||Ke(!1,"Request's resolvedUrl must be s...
  function Te (line 3) | function Te(e){var t;if(qe.loadBootResource){const o=null!==(t=e.hash)&&...
  function Re (line 3) | function Re(e){e.pendingDownloadInternal=null,e.pendingDownload=null,e.b...
  function je (line 3) | function je(e){let t=e.lastIndexOf("/");return t>=0&&t++,e.substring(t)}
  function xe (line 3) | async function xe(e){if(!e)return;const t=Object.keys(e);await Promise.a...
  function Ae (line 3) | async function Ae(e,t){if(!qe.libraryInitializers)return;const o=[];for(...
  function Se (line 3) | async function Se(e,t,o){try{await o()}catch(o){throw w(`Failed to invok...
  function De (line 3) | function De(e,t){if(e===t)return e;const o={...t};return void 0!==o.asse...
  function ke (line 3) | function ke(e,t){if(e===t)return e;const o={...t};return o.config&&(e.co...
  function Ce (line 3) | function Ce(e,t){if(e===t)return e;const o={...t};return void 0!==o.asse...
  function Ie (line 3) | function Ie(e,t){if(e===t)return e;for(const o in t)e[o]={...e[o],...t[o...
  function Me (line 3) | function Me(){const e=qe.config;if(e.environmentVariables=e.environmentV...
  function Le (line 3) | async function Le(e){var t;if(Pe)return void await qe.afterConfigLoaded....
  function Ke (line 3) | function Ke(e,t){if(e)return;const o="Assert failed: "+("function"==type...
  function Xe (line 3) | function Xe(){return void 0!==qe.exitCode}
  function et (line 3) | function et(){return Fe.runtimeReady&&!Xe()}
  function tt (line 3) | function tt(){Xe()&&Ke(!1,`.NET runtime already exited with ${qe.exitCod...
  function ot (line 3) | function ot(){We&&(globalThis.addEventListener("unhandledrejection",ct),...
  function it (line 3) | function it(e){rt&&rt(e),at(e,qe.exitReason)}
  function st (line 3) | function st(e){nt&&nt(e||qe.exitReason),at(1,e||qe.exitReason)}
  function at (line 3) | function at(t,o){var n,r;const i=o&&"object"==typeof o;t=i&&"number"==ty...
  function lt (line 3) | function lt(e,t){if(Fe.runtimeReady&&Fe.nativeExit)try{Fe.nativeExit(e)}...
  function ct (line 3) | function ct(e){dt(e,e.reason,"rejection")}
  function ut (line 3) | function ut(e){dt(e,e.error,"error")}
  function dt (line 3) | function dt(e,t,o){e.preventDefault();try{t||(t=new Error("Unhandled "+o...
  function pt (line 3) | async function pt(e){if(!ht){if(ht=!0,We&&qe.config.forwardConsoleLogsTo...
  function bt (line 3) | async function bt(e){return await pt(e),nt=Qe.onAbort,rt=Qe.onExit,Qe.on...
  function wt (line 3) | function wt(){const e=le("js-module-runtime"),t=le("js-module-native");r...
  function yt (line 3) | async function yt(e){const{initializeExports:t,initializeReplacements:o,...
  method withModuleConfig (line 3) | withModuleConfig(e){try{return ke(Qe,e),this}catch(e){throw at(1,e),e}}
  method withOnConfigLoaded (line 3) | withOnConfigLoaded(e){try{return ke(Qe,{onConfigLoaded:e}),this}catch(e)...
  method withConsoleForwarding (line 3) | withConsoleForwarding(){try{return De(Ze,{forwardConsoleLogsToWS:!0}),th...
  method withExitOnUnhandledError (line 3) | withExitOnUnhandledError(){try{return De(Ze,{exitOnUnhandledError:!0}),o...
  method withAsyncFlushOnExit (line 3) | withAsyncFlushOnExit(){try{return De(Ze,{asyncFlushOnExit:!0}),this}catc...
  method withExitCodeLogging (line 3) | withExitCodeLogging(){try{return De(Ze,{logExitCode:!0}),this}catch(e){t...
  method withElementOnExit (line 3) | withElementOnExit(){try{return De(Ze,{appendElementOnExit:!0}),this}catc...
  method withInteropCleanupOnExit (line 3) | withInteropCleanupOnExit(){try{return De(Ze,{interopCleanupOnExit:!0}),t...
  method withDumpThreadsOnNonZeroExit (line 3) | withDumpThreadsOnNonZeroExit(){try{return De(Ze,{dumpThreadsOnNonZeroExi...
  method withWaitingForDebugger (line 3) | withWaitingForDebugger(e){try{return De(Ze,{waitForDebugger:e}),this}cat...
  method withInterpreterPgo (line 3) | withInterpreterPgo(e,t){try{return De(Ze,{interpreterPgo:e,interpreterPg...
  method withConfig (line 3) | withConfig(e){try{return De(Ze,e),this}catch(e){throw at(1,e),e}}
  method withConfigSrc (line 3) | withConfigSrc(e){try{return e&&"string"==typeof e||Ke(!1,"must be file p...
  method withVirtualWorkingDirectory (line 3) | withVirtualWorkingDirectory(e){try{return e&&"string"==typeof e||Ke(!1,"...
  method withEnvironmentVariable (line 3) | withEnvironmentVariable(e,t){try{const o={};return o[e]=t,De(Ze,{environ...
  method withEnvironmentVariables (line 3) | withEnvironmentVariables(e){try{return e&&"object"==typeof e||Ke(!1,"mus...
  method withDiagnosticTracing (line 3) | withDiagnosticTracing(e){try{return"boolean"!=typeof e&&Ke(!1,"must be b...
  method withDebugging (line 3) | withDebugging(e){try{return null!=e&&"number"==typeof e||Ke(!1,"must be ...
  method withApplicationArguments (line 3) | withApplicationArguments(...e){try{return e&&Array.isArray(e)||Ke(!1,"mu...
  method withRuntimeOptions (line 3) | withRuntimeOptions(e){try{return e&&Array.isArray(e)||Ke(!1,"must be arr...
  method withMainAssembly (line 3) | withMainAssembly(e){try{return De(Ze,{mainAssemblyName:e}),this}catch(e)...
  method withApplicationArgumentsFromQuery (line 3) | withApplicationArgumentsFromQuery(){try{if(!globalThis.window)throw new ...
  method withApplicationEnvironment (line 3) | withApplicationEnvironment(e){try{return De(Ze,{applicationEnvironment:e...
  method withApplicationCulture (line 3) | withApplicationCulture(e){try{return De(Ze,{applicationCulture:e}),this}...
  method withResourceLoader (line 3) | withResourceLoader(e){try{return qe.loadBootResource=e,this}catch(e){thr...
  method download (line 3) | async download(){try{await async function(){pt(Qe),await Le(Qe),fe(),awa...
  method create (line 3) | async create(){try{return this.instance||(this.instance=await async func...
  method run (line 3) | async run(){try{return Qe.config||Ke(!1,"Null moduleConfig.config"),this...

FILE: docfx/AppBundle/_framework/dotnet.native.js
  function locateFile (line 8) | function locateFile(path){if(Module["locateFile"]){return Module["locate...
  function assert (line 8) | function assert(condition,text){if(!condition){abort(text)}}
  function updateMemoryViews (line 8) | function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEA...
  function preRun (line 8) | function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="func...
  function initRuntime (line 8) | function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!...
  function exitRuntime (line 8) | function exitRuntime(){___funcs_on_exit();callRuntimeCallbacks(__ATEXIT_...
  function postRun (line 8) | function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="f...
  function addOnPreRun (line 8) | function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}
  function addOnInit (line 8) | function addOnInit(cb){__ATINIT__.unshift(cb)}
  function addOnPostRun (line 8) | function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}
  function getUniqueRunDependency (line 8) | function getUniqueRunDependency(id){return id}
  function addRunDependency (line 8) | function addRunDependency(id){runDependencies++;Module["monitorRunDepend...
  function removeRunDependency (line 8) | function removeRunDependency(id){runDependencies--;Module["monitorRunDep...
  function abort (line 8) | function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";...
  function getBinarySync (line 8) | function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return...
  function getBinaryPromise (line 8) | function getBinaryPromise(binaryFile){if(!wasmBinary&&(ENVIRONMENT_IS_WE...
  function instantiateArrayBuffer (line 8) | function instantiateArrayBuffer(binaryFile,imports,receiver){return getB...
  function instantiateAsync (line 8) | function instantiateAsync(binary,binaryFile,imports,callback){if(!binary...
  function createWasm (line 8) | function createWasm(){var info={"env":wasmImports,"wasi_snapshot_preview...
  function GetWindowInnerWidth (line 8) | function GetWindowInnerWidth(){return window.innerWidth}
  function GetWindowInnerHeight (line 8) | function GetWindowInnerHeight(){return window.innerHeight}
  function ExitStatus (line 8) | function ExitStatus(status){this.name="ExitStatus";this.message=`Program...
  function getValue (line 8) | function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(t...
  function setValue (line 8) | function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";sw...
  function trim (line 8) | function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[sta...
  function intArrayFromString (line 8) | function intArrayFromString(stringy,dontAddNull,length){var len=length>0...
  method init (line 8) | init(){}
  method shutdown (line 8) | shutdown(){}
  method register (line 8) | register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.register...
  method open (line 8) | open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.Er...
  method close (line 8) | close(stream){stream.tty.ops.fsync(stream.tty)}
  method fsync (line 8) | fsync(stream){stream.tty.ops.fsync(stream.tty)}
  method read (line 8) | read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.ge...
  method write (line 8) | write(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.p...
  method get_char (line 8) | get_char(tty){return FS_stdin_getChar()}
  method put_char (line 8) | put_char(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.out...
  method fsync (line 8) | fsync(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty...
  method ioctl_tcgets (line 8) | ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:353...
  method ioctl_tcsets (line 8) | ioctl_tcsets(tty,optional_actions,data){return 0}
  method ioctl_tiocgwinsz (line 8) | ioctl_tiocgwinsz(tty){return[24,80]}
  method put_char (line 8) | put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.out...
  method fsync (line 8) | fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty...
  method mount (line 8) | mount(mount){return MEMFS.createNode(null,"/",16384|511,0)}
  method createNode (line 8) | createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){...
  method getFileDataAsTypedArray (line 8) | getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0)...
  method expandFileStorage (line 8) | expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node....
  method resizeFileStorage (line 8) | resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(new...
  method getattr (line 8) | getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr...
  method setattr (line 8) | setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr...
  method lookup (line 8) | lookup(parent,name){throw FS.genericErrors[44]}
  method mknod (line 8) | mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)}
  method rename (line 8) | rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_no...
  method unlink (line 8) | unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.n...
  method rmdir (line 8) | rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node...
  method readdir (line 8) | readdir(node){var entries=[".",".."];for(var key of Object.keys(node.con...
  method symlink (line 8) | symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname...
  method readlink (line 8) | readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}ret...
  method read (line 8) | read(stream,buffer,offset,length,position){var contents=stream.node.cont...
  method write (line 8) | write(stream,buffer,offset,length,position,canOwn){if(buffer.buffer===HE...
  method llseek (line 8) | llseek(stream,offset,whence){var position=offset;if(whence===1){position...
  method allocate (line 8) | allocate(stream,offset,length){MEMFS.expandFileStorage(stream.node,offse...
  method mmap (line 8) | mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode))...
  method msync (line 8) | msync(stream,buffer,offset,length,mmapFlags){MEMFS.stream_ops.write(stre...
  function processData (line 8) | function processData(byteArray){function finish(byteArray){preFinish?.()...
  method constructor (line 8) | constructor(errno){this.name="ErrnoError";this.errno=errno}
  method constructor (line 8) | constructor(){this.shared={}}
  method object (line 8) | get object(){return this.node}
  method object (line 8) | set object(val){this.node=val}
  method isRead (line 8) | get isRead(){return(this.flags&2097155)!==1}
  method isWrite (line 8) | get isWrite(){return(this.flags&2097155)!==0}
  method isAppend (line 8) | get isAppend(){return this.flags&1024}
  method flags (line 8) | get flags(){return this.shared.flags}
  method flags (line 8) | set flags(val){this.shared.flags=val}
  method position (line 8) | get position(){return this.shared.position}
  method position (line 8) | set position(val){this.shared.position=val}
  method constructor (line 8) | constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=p...
  method read (line 8) | get read(){return(this.mode&this.readMode)===this.readMode}
  method read (line 8) | set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}
  method write (line 8) | get write(){return(this.mode&this.writeMode)===this.writeMode}
  method write (line 8) | set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}
  method isFolder (line 8) | get isFolder(){return FS.isDir(this.mode)}
  method isDevice (line 8) | get isDevice(){return FS.isChrdev(this.mode)}
  method lookupPath (line 8) | lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path...
  method getPath (line 8) | getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mo...
  method hashName (line 8) | hashName(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(...
  method hashAddNode (line 8) | hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.na...
  method hashRemoveNode (line 8) | hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(F...
  method lookupNode (line 8) | lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){thr...
  method createNode (line 8) | createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mod...
  method destroyNode (line 8) | destroyNode(node){FS.hashRemoveNode(node)}
  method isRoot (line 8) | isRoot(node){return node===node.parent}
  method isMountpoint (line 8) | isMountpoint(node){return!!node.mounted}
  method isFile (line 8) | isFile(mode){return(mode&61440)===32768}
  method isDir (line 8) | isDir(mode){return(mode&61440)===16384}
  method isLink (line 8) | isLink(mode){return(mode&61440)===40960}
  method isChrdev (line 8) | isChrdev(mode){return(mode&61440)===8192}
  method isBlkdev (line 8) | isBlkdev(mode){return(mode&61440)===24576}
  method isFIFO (line 8) | isFIFO(mode){return(mode&61440)===4096}
  method isSocket (line 8) | isSocket(mode){return(mode&49152)===49152}
  method flagsToPermissionString (line 8) | flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&5...
  method nodePermissions (line 8) | nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.i...
  method mayLookup (line 8) | mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermi...
  method mayCreate (line 8) | mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch...
  method mayDelete (line 8) | mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catc...
  method mayOpen (line 8) | mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return ...
  method nextfd (line 8) | nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){retu...
  method getStreamChecked (line 8) | getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new F...
  method createStream (line 8) | createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);...
  method closeStream (line 8) | closeStream(fd){FS.streams[fd]=null}
  method dupStream (line 8) | dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);st...
  method open (line 8) | open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops...
  method llseek (line 8) | llseek(){throw new FS.ErrnoError(70)}
  method registerDevice (line 8) | registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}}
  method getMounts (line 8) | getMounts(mount){var mounts=[];var check=[mount];while(check.length){var...
  method syncfs (line 8) | syncfs(populate,callback){if(typeof populate=="function"){callback=popul...
  method mount (line 8) | mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountp...
  method unmount (line 8) | unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:fa...
  method lookup (line 8) | lookup(parent,name){return parent.node_ops.lookup(parent,name)}
  method mknod (line 8) | mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var pa...
  method create (line 8) | create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;...
  method mkdir (line 8) | mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=1638...
  method mkdirTree (line 8) | mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;i<dir...
  method mkdev (line 8) | mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|...
  method symlink (line 8) | symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.Errn...
  method rename (line 8) | rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new...
  method rmdir (line 8) | rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=look...
  method readdir (line 8) | readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=look...
  method unlink (line 8) | unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=loo...
  method readlink (line 8) | readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!l...
  method stat (line 8) | stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow}...
  method lstat (line 8) | lstat(path){return FS.stat(path,true)}
  method chmod (line 8) | chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var looku...
  method lchmod (line 8) | lchmod(path,mode){FS.chmod(path,mode,true)}
  method fchmod (line 8) | fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.chmod(stream.node,...
  method chown (line 8) | chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lo...
  method lchown (line 8) | lchown(path,uid,gid){FS.chown(path,uid,gid,true)}
  method fchown (line 8) | fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.chown(stream.no...
  method truncate (line 8) | truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typ...
  method ftruncate (line 8) | ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if((stream.flags&20...
  method utime (line 8) | utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var...
  method open (line 8) | open(path,flags,mode){if(path===""){throw new FS.ErrnoError(44)}flags=ty...
  method close (line 8) | close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stre...
  method isClosed (line 8) | isClosed(stream){return stream.fd===null}
  method llseek (line 8) | llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoE...
  method read (line 8) | read(stream,buffer,offset,length,position){if(length<0||position<0){thro...
  method write (line 8) | write(stream,buffer,offset,length,position,canOwn){if(length<0||position...
  method allocate (line 8) | allocate(stream,offset,length){if(FS.isClosed(stream)){throw new FS.Errn...
  method mmap (line 8) | mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&...
  method msync (line 8) | msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync...
  method ioctl (line 8) | ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoErr...
  method readFile (line 8) | readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encod...
  method writeFile (line 8) | writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.op...
  method chdir (line 8) | chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node=...
  method createDefaultDirectories (line 8) | createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("...
  method createDefaultDevices (line 8) | createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3...
  method createSpecialDirectories (line 8) | createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/pr...
  method createStandardStreams (line 8) | createStandardStreams(){if(Module["stdin"]){FS.createDevice("/dev","stdi...
  method staticInit (line 8) | staticInit(){[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoErro...
  method init (line 8) | init(input,output,error){FS.init.initialized=true;Module["stdin"]=input|...
  method quit (line 8) | quit(){FS.init.initialized=false;_fflush(0);for(var i=0;i<FS.streams.len...
  method findObject (line 8) | findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontRes...
  method analyzePath (line 8) | analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,...
  method createPath (line 8) | createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?...
  method createFile (line 8) | createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(...
  method createDataFile (line 8) | createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;i...
  method createDevice (line 8) | createDevice(parent,name,input,output){var path=PATH.join2(typeof parent...
  method forceLoadFile (line 8) | forceLoadFile(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents...
  method createLazyFile (line 8) | createLazyFile(parent,name,url,canRead,canWrite){class LazyUint8Array{co...
  method calculateAt (line 8) | calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var ...
  method doStat (line 8) | doStat(func,path,buf){var stat=func(path);HEAP32[buf>>2]=stat.dev;HEAP32...
  method doMsync (line 8) | doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){t...
  method get (line 8) | get(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret}
  method getp (line 8) | getp(){return SYSCALLS.get()}
  method getStr (line 8) | getStr(ptr){var ret=UTF8ToString(ptr);return ret}
  method getStreamFromFD (line 8) | getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream}
  function ___syscall_faccessat (line 8) | function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS....
  function ___syscall_fcntl64 (line 8) | function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try...
  function ___syscall_fstat64 (line 8) | function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFro...
  function ___syscall_statfs64 (line 8) | function ___syscall_statfs64(path,size,buf){try{path=SYSCALLS.getStr(pat...
  function ___syscall_fstatfs64 (line 8) | function ___syscall_fstatfs64(fd,size,buf){try{var stream=SYSCALLS.getSt...
  function ___syscall_ftruncate64 (line 8) | function ___syscall_ftruncate64(fd,length){length=bigintToI53Checked(len...
  function ___syscall_getcwd (line 8) | function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=F...
  function ___syscall_getdents64 (line 8) | function ___syscall_getdents64(fd,dirp,count){try{var stream=SYSCALLS.ge...
  function ___syscall_ioctl (line 8) | function ___syscall_ioctl(fd,op,varargs){SYSCALLS.varargs=varargs;try{va...
  function ___syscall_lstat64 (line 8) | function ___syscall_lstat64(path,buf){try{path=SYSCALLS.getStr(path);ret...
  function ___syscall_newfstatat (line 8) | function ___syscall_newfstatat(dirfd,path,buf,flags){try{path=SYSCALLS.g...
  function ___syscall_openat (line 8) | function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=va...
  function ___syscall_readlinkat (line 8) | function ___syscall_readlinkat(dirfd,path,buf,bufsize){try{path=SYSCALLS...
  function ___syscall_stat64 (line 8) | function ___syscall_stat64(path,buf){try{path=SYSCALLS.getStr(path);retu...
  function ___syscall_unlinkat (line 8) | function ___syscall_unlinkat(dirfd,path,flags){try{path=SYSCALLS.getStr(...
  function __localtime_js (line 8) | function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);var da...
  function __mmap_js (line 8) | function __mmap_js(len,prot,flags,fd,offset,allocated,addr){offset=bigin...
  function __munmap_js (line 8) | function __munmap_js(addr,len,prot,flags,fd,offset){offset=bigintToI53Ch...
  function extractZone (line 8) | function extractZone(date){var match=date.toTimeString().match(/\(([A-Za...
  method removeAllEventListeners (line 8) | removeAllEventListeners(){while(JSEvents.eventHandlers.length){JSEvents....
  method registerRemoveEventListeners (line 8) | registerRemoveEventListeners(){if(!JSEvents.removeEventListenersRegister...
  method deferCall (line 8) | deferCall(targetFunction,precedence,argsList){function arraysHaveEqualCo...
  method removeDeferredCalls (line 8) | removeDeferredCalls(targetFunction){for(var i=0;i<JSEvents.deferredCalls...
  method canPerformEventHandlerRequests (line 8) | canPerformEventHandlerRequests(){if(navigator.userActivation){return nav...
  method runDeferredCalls (line 8) | runDeferredCalls(){if(!JSEvents.canPerformEventHandlerRequests()){return...
  method _removeHandler (line 8) | _removeHandler(i){var h=JSEvents.eventHandlers[i];h.target.removeEventLi...
  method registerOrRemoveHandler (line 8) | registerOrRemoveHandler(eventHandler){if(!eventHandler.target){return-4}...
  method getNodeNameForTarget (line 8) | getNodeNameForTarget(target){if(!target)return"";if(target==window)retur...
  method fullscreenEnabled (line 8) | fullscreenEnabled(){return document.fullscreenEnabled||document.webkitFu...
  function fixedGetContext (line 8) | function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2...
  function roundedToNextMultipleOf (line 8) | function roundedToNextMultipleOf(x,y){return x+y-1&-y}
  function checkIsRunning (line 8) | function checkIsRunning(){if(thisMainLoopId<Browser.mainLoop.currentlyRu...
  method pause (line 8) | pause(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunnin...
  method resume (line 8) | resume(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Brow...
  method updateStatus (line 8) | updateStatus(){if(Module["setStatus"]){var message=Module["statusMessage...
  method runIter (line 8) | runIter(func){if(ABORT)return;if(Module["preMainLoop"]){var preRet=Modul...
  method init (line 8) | init(){if(Browser.initted)return;Browser.initted=true;var imagePlugin={}...
  method createContext (line 8) | createContext(canvas,useWebGL,setInModule,webGLContextAttributes){if(use...
  method destroyContext (line 8) | destroyContext(canvas,useWebGL,setInModule){}
  method requestFullscreen (line 8) | requestFullscreen(lockPointer,resizeCanvas){Browser.lockPointer=lockPoin...
  method exitFullscreen (line 8) | exitFullscreen(){if(!Browser.isFullscreen){return false}var CFS=document...
  method fakeRequestAnimationFrame (line 8) | fakeRequestAnimationFrame(func){var now=Date.now();if(Browser.nextRAF===...
  method requestAnimationFrame (line 8) | requestAnimationFrame(func){if(typeof requestAnimationFrame=="function")...
  method safeSetTimeout (line 8) | safeSetTimeout(func,timeout){return safeSetTimeout(func,timeout)}
  method safeRequestAnimationFrame (line 8) | safeRequestAnimationFrame(func){runtimeKeepalivePush();return Browser.re...
  method getMimetype (line 8) | getMimetype(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"i...
  method getUserMedia (line 8) | getUserMedia(func){window.getUserMedia||=navigator["getUserMedia"]||navi...
  method getMovementX (line 8) | getMovementX(event){return event["movementX"]||event["mozMovementX"]||ev...
  method getMovementY (line 8) | getMovementY(event){return event["movementY"]||event["mozMovementY"]||ev...
  method getMouseWheelDelta (line 8) | getMouseWheelDelta(event){var delta=0;switch(event.type){case"DOMMouseSc...
  method calculateMouseCoords (line 8) | calculateMouseCoords(pageX,pageY){var rect=Module["canvas"].getBoundingC...
  method setMouseCoords (line 8) | setMouseCoords(pageX,pageY){const{x:x,y:y}=Browser.calculateMouseCoords(...
  method calculateMouseEvent (line 8) | calculateMouseEvent(event){if(Browser.pointerLock){if(event.type!="mouse...
  method updateResizeListeners (line 8) | updateResizeListeners(){var canvas=Module["canvas"];Browser.resizeListen...
  method setCanvasSize (line 8) | setCanvasSize(width,height,noUpdates){var canvas=Module["canvas"];Browse...
  method setFullscreenCanvasSize (line 8) | setFullscreenCanvasSize(){if(typeof SDL!="undefined"){var flags=HEAPU32[...
  method setWindowedCanvasSize (line 8) | setWindowedCanvasSize(){if(typeof SDL!="undefined"){var flags=HEAPU32[SD...
  method updateCanvasDimensions (line 8) | updateCanvasDimensions(canvas,wNative,hNative){if(wNative&&hNative){canv...
  function _fd_close (line 8) | function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.cl...
  function _fd_pread (line 8) | function _fd_pread(fd,iov,iovcnt,offset,pnum){offset=bigintToI53Checked(...
  function _fd_read (line 8) | function _fd_read(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStreamF...
  function _fd_seek (line 8) | function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(...
  function _fd_write (line 8) | function _fd_write(fd,iov,iovcnt,pnum){try{var stream=SYSCALLS.getStream...
  function GLFW_Window (line 8) | function GLFW_Window(id,width,height,framebufferWidth,framebufferHeight,...
  function save (line 8) | function save(file){var path="/"+drop_dir+"/"+file.name.replace(/\//g,"_...
  method requestFullscreen (line 8) | requestFullscreen(lockPointer,resizeCanvas){Browser.lockPointer=lockPoin...
  method updateCanvasDimensions (line 8) | updateCanvasDimensions(canvas,wNative,hNative){const scale=GLFW.getHiDPI...
  method calculateMouseCoords (line 8) | calculateMouseCoords(pageX,pageY){var rect=Module["canvas"].getBoundingC...
  method getDevicePixelRatio (line 8) | getDevicePixelRatio(){return typeof devicePixelRatio=="number"&&devicePi...
  method isHiDPIAware (line 8) | isHiDPIAware(){if(GLFW.active)return GLFW.active.attributes[139276]>0;el...
  method adjustCanvasDimensions (line 8) | adjustCanvasDimensions(){const canvas=Module["canvas"];Browser.updateCan...
  method getHiDPIScale (line 8) | getHiDPIScale(){return GLFW.isHiDPIAware()?GLFW.scale:1}
  method onDevicePixelRatioChange (line 8) | onDevicePixelRatioChange(){GLFW.onWindowContentScaleChanged(GLFW.getDevi...
  function _mono_interp_flush_jitcall_queue (line 8) | function _mono_interp_flush_jitcall_queue(){return{runtime_idx:12}}
  function _mono_interp_invoke_wasm_jit_call_trampoline (line 8) | function _mono_interp_invoke_wasm_jit_call_trampoline(){return{runtime_i...
  function _mono_interp_jit_wasm_entry_trampoline (line 8) | function _mono_interp_jit_wasm_entry_trampoline(){return{runtime_idx:9}}
  function _mono_interp_jit_wasm_jit_call_trampoline (line 8) | function _mono_interp_jit_wasm_jit_call_trampoline(){return{runtime_idx:...
  function _mono_interp_record_interp_entry (line 8) | function _mono_interp_record_interp_entry(){return{runtime_idx:8}}
  function _mono_interp_tier_prepare_jiterpreter (line 8) | function _mono_interp_tier_prepare_jiterpreter(){return{runtime_idx:7}}
  function _mono_jiterp_free_method_data_js (line 8) | function _mono_jiterp_free_method_data_js(){return{runtime_idx:13}}
  function _mono_wasm_bind_js_import_ST (line 8) | function _mono_wasm_bind_js_import_ST(){return{runtime_idx:22}}
  function _mono_wasm_browser_entropy (line 8) | function _mono_wasm_browser_entropy(){return{runtime_idx:19}}
  function _mono_wasm_cancel_promise (line 8) | function _mono_wasm_cancel_promise(){return{runtime_idx:26}}
  function _mono_wasm_change_case (line 8) | function _mono_wasm_change_case(){return{runtime_idx:27}}
  function _mono_wasm_compare_string (line 8) | function _mono_wasm_compare_string(){return{runtime_idx:28}}
  function _mono_wasm_console_clear (line 8) | function _mono_wasm_console_clear(){return{runtime_idx:20}}
  function _mono_wasm_ends_with (line 8) | function _mono_wasm_ends_with(){return{runtime_idx:30}}
  function _mono_wasm_get_calendar_info (line 8) | function _mono_wasm_get_calendar_info(){return{runtime_idx:32}}
  function _mono_wasm_get_culture_info (line 8) | function _mono_wasm_get_culture_info(){return{runtime_idx:33}}
  function _mono_wasm_get_first_day_of_week (line 8) | function _mono_wasm_get_first_day_of_week(){return{runtime_idx:34}}
  function _mono_wasm_get_first_week_of_year (line 8) | function _mono_wasm_get_first_week_of_year(){return{runtime_idx:35}}
  function _mono_wasm_get_locale_info (line 8) | function _mono_wasm_get_locale_info(){return{runtime_idx:36}}
  function _mono_wasm_index_of (line 8) | function _mono_wasm_index_of(){return{runtime_idx:31}}
  function _mono_wasm_invoke_js_function (line 8) | function _mono_wasm_invoke_js_function(){return{runtime_idx:23}}
  function _mono_wasm_invoke_jsimport_ST (line 8) | function _mono_wasm_invoke_jsimport_ST(){return{runtime_idx:24}}
  function _mono_wasm_release_cs_owned_object (line 8) | function _mono_wasm_release_cs_owned_object(){return{runtime_idx:21}}
  function _mono_wasm_resolve_or_reject_promise (line 8) | function _mono_wasm_resolve_or_reject_promise(){return{runtime_idx:25}}
  function _mono_wasm_schedule_timer (line 8) | function _mono_wasm_schedule_timer(){return{runtime_idx:0}}
  function _mono_wasm_set_entrypoint_breakpoint (line 8) | function _mono_wasm_set_entrypoint_breakpoint(){return{runtime_idx:17}}
  function _mono_wasm_starts_with (line 8) | function _mono_wasm_starts_with(){return{runtime_idx:29}}
  function _mono_wasm_trace_logger (line 8) | function _mono_wasm_trace_logger(){return{runtime_idx:16}}
  function _schedule_background_exec (line 8) | function _schedule_background_exec(){return{runtime_idx:6}}
  function leadingSomething (line 8) | function leadingSomething(value,digits,character){var str=typeof value==...
  function leadingNulls (line 8) | function leadingNulls(value,digits){return leadingSomething(value,digits...
  function compareByDay (line 8) | function compareByDay(date1,date2){function sgn(value){return value<0?-1...
  function getFirstWeekStartDate (line 8) | function getFirstWeekStartDate(janFourth){switch(janFourth.getDay()){cas...
  function getWeekBasedYear (line 8) | function getWeekBasedYear(date){var thisDate=addDays(new Date(date.tm_ye...
  function convertReturnValue (line 8) | function convertReturnValue(ret){if(returnType==="string"){return UTF8To...
  function onDone (line 8) | function onDone(ret){if(stack!==0)stackRestore(stack);return convertRetu...
  function run (line 8) | function run(){if(runDependencies>0){return}preRun();if(runDependencies>...

FILE: docfx/AppBundle/_framework/dotnet.runtime.js
  function i (line 3) | function i(e,t,n,r){let o=void 0===r&&a.indexOf(t)>=0&&(!n||n.every((e=>...
  function f (line 3) | function f(e,t,n){if(!Number.isSafeInteger(e))throw new Error(`Assert fa...
  function _ (line 3) | function _(e,t){Y().fill(0,e,e+t)}
  function m (line 3) | function m(e,t){const n=!!t;"number"==typeof t&&f(t,0,1),Xe.HEAP32[e>>>2...
  function h (line 3) | function h(e,t){const n=!!t;"number"==typeof t&&f(t,0,1),Xe.HEAPU8[e]=n?...
  function g (line 3) | function g(e,t){f(t,0,255),Xe.HEAPU8[e]=t}
  function b (line 3) | function b(e,t){f(t,0,65535),Xe.HEAPU16[e>>>1]=t}
  function y (line 3) | function y(e,t,n){f(n,0,65535),e[t>>>1]=n}
  function w (line 3) | function w(e,t){f(t,0,4294967295),Xe.HEAPU32[e>>>2]=t}
  function k (line 3) | function k(e,t){f(t,-128,127),Xe.HEAP8[e]=t}
  function S (line 3) | function S(e,t){f(t,-32768,32767),Xe.HEAP16[e>>>1]=t}
  function v (line 3) | function v(e,t){f(t,-2147483648,2147483647),Xe.HEAP32[e>>>2]=t}
  function U (line 3) | function U(e){if(0!==e)switch(e){case 1:throw new Error("value was not a...
  function E (line 3) | function E(e,t){if(!Number.isSafeInteger(t))throw new Error(`Assert fail...
  function T (line 3) | function T(e,t){if(!Number.isSafeInteger(t))throw new Error(`Assert fail...
  function x (line 3) | function x(e,t){if("bigint"!=typeof t)throw new Error(`Assert failed: Va...
  function I (line 3) | function I(e,t){if("number"!=typeof t)throw new Error(`Assert failed: Va...
  function A (line 3) | function A(e,t){if("number"!=typeof t)throw new Error(`Assert failed: Va...
  function $ (line 3) | function $(e){const t=Xe.HEAPU32[e>>>2];return t>1&&j&&(j=!1,Me(`getB32:...
  function L (line 3) | function L(e){return!!Xe.HEAPU8[e]}
  function R (line 3) | function R(e){return Xe.HEAPU8[e]}
  function B (line 3) | function B(e){return Xe.HEAPU16[e>>>1]}
  function N (line 3) | function N(e){return Xe.HEAPU32[e>>>2]}
  function C (line 3) | function C(e,t){return e[t>>>2]}
  function O (line 3) | function O(e){return o.mono_wasm_get_i32_unaligned(e)}
  function D (line 3) | function D(e){return o.mono_wasm_get_i32_unaligned(e)>>>0}
  function F (line 3) | function F(e){return Xe.HEAP8[e]}
  function M (line 3) | function M(e){return Xe.HEAP16[e>>>1]}
  function P (line 3) | function P(e){return Xe.HEAP32[e>>>2]}
  function V (line 3) | function V(e){const t=o.mono_wasm_i52_to_f64(e,ot._i52_error_scratch_buf...
  function z (line 3) | function z(e){const t=o.mono_wasm_u52_to_f64(e,ot._i52_error_scratch_buf...
  function H (line 3) | function H(e){return Xe.HEAP64[e>>>3]}
  function W (line 3) | function W(e){return Xe.HEAPF32[e>>>2]}
  function q (line 3) | function q(e){return Xe.HEAPF64[e>>>3]}
  function G (line 3) | function G(){return Xe.HEAP8}
  function J (line 3) | function J(){return Xe.HEAP16}
  function X (line 3) | function X(){return Xe.HEAP32}
  function Q (line 3) | function Q(){return Xe.HEAP64}
  function Y (line 3) | function Y(){return Xe.HEAPU8}
  function Z (line 3) | function Z(){return Xe.HEAPU16}
  function K (line 3) | function K(){return Xe.HEAPU32}
  function ee (line 3) | function ee(){return Xe.HEAPF32}
  function te (line 3) | function te(){return Xe.HEAPF64}
  function re (line 3) | function re(){if(ne)throw new Error("GC is already locked");ne=!0}
  function oe (line 3) | function oe(){if(!ne)throw new Error("GC is not locked");ne=!1}
  function ue (line 3) | function ue(e,t){if(e<=0)throw new Error("capacity >= 1");const n=4*(e|=...
  class WasmRootBufferImpl (line 3) | class WasmRootBufferImpl{constructor(e,t,n,r){const s=4*t;this.__offset=...
    method constructor (line 3) | constructor(e,t,n,r){const s=4*t;this.__offset=e,this.__offset32=e>>>2...
    method _throw_index_out_of_range (line 3) | _throw_index_out_of_range(){throw new Error("index out of range")}
    method _check_in_range (line 3) | _check_in_range(e){(e>=this.__count||e<0)&&this._throw_index_out_of_ra...
    method get_address (line 3) | get_address(e){return this._check_in_range(e),this.__offset+4*e}
    method get_address_32 (line 3) | get_address_32(e){return this._check_in_range(e),this.__offset32+e}
    method get (line 3) | get(e){this._check_in_range(e);const t=this.get_address_32(e);return K...
    method set (line 3) | set(e,t){const n=this.get_address(e);return o.mono_wasm_write_managed_...
    method copy_value_from_address (line 3) | copy_value_from_address(e,t){const n=this.get_address(e);o.mono_wasm_c...
    method _unsafe_get (line 3) | _unsafe_get(e){return K()[this.__offset32+e]}
    method _unsafe_set (line 3) | _unsafe_set(e,t){const n=this.__offset+e;o.mono_wasm_write_managed_poi...
    method clear (line 3) | clear(){this.__offset&&_(this.__offset,4*this.__count)}
    method release (line 3) | release(){this.__offset&&this.__ownsAllocation&&(o.mono_wasm_deregiste...
    method toString (line 3) | toString(){return`[root buffer @${this.get_address(0)}, size ${this.__...
  class de (line 3) | class de{constructor(e,t){this.__buffer=e,this.__index=t}get_address(){r...
    method constructor (line 3) | constructor(e,t){this.__buffer=e,this.__index=t}
    method get_address (line 3) | get_address(){return this.__buffer.get_address(this.__index)}
    method get_address_32 (line 3) | get_address_32(){return this.__buffer.get_address_32(this.__index)}
    method address (line 3) | get address(){return this.__buffer.get_address(this.__index)}
    method get (line 3) | get(){return this.__buffer._unsafe_get(this.__index)}
    method set (line 3) | set(e){const t=this.__buffer.get_address(this.__index);return o.mono_w...
    method copy_from (line 3) | copy_from(e){const t=e.address,n=this.address;o.mono_wasm_copy_managed...
    method copy_to (line 3) | copy_to(e){const t=this.address,n=e.address;o.mono_wasm_copy_managed_p...
    method copy_from_address (line 3) | copy_from_address(e){const t=this.address;o.mono_wasm_copy_managed_poi...
    method copy_to_address (line 3) | copy_to_address(e){const t=this.address;o.mono_wasm_copy_managed_point...
    method value (line 3) | get value(){return this.get()}
    method value (line 3) | set value(e){this.set(e)}
    method valueOf (line 3) | valueOf(){throw new Error("Implicit conversion of roots to pointers is...
    method clear (line 3) | clear(){const e=this.__buffer.get_address_32(this.__index);K()[e]=0}
    method release (line 3) | release(){if(!this.__buffer)throw new Error("No buffer");var e;le.leng...
    method toString (line 3) | toString(){return`[root @${this.address}]`}
  class fe (line 3) | class fe{constructor(e){this.__external_address=0,this.__external_addres...
    method constructor (line 3) | constructor(e){this.__external_address=0,this.__external_address_32=0,...
    method _set_address (line 3) | _set_address(e){this.__external_address=e,this.__external_address_32=e...
    method address (line 3) | get address(){return this.__external_address}
    method get_address (line 3) | get_address(){return this.__external_address}
    method get_address_32 (line 3) | get_address_32(){return this.__external_address_32}
    method get (line 3) | get(){return K()[this.__external_address_32]}
    method set (line 3) | set(e){return o.mono_wasm_write_managed_pointer_unsafe(this.__external...
    method copy_from (line 3) | copy_from(e){const t=e.address,n=this.__external_address;o.mono_wasm_c...
    method copy_to (line 3) | copy_to(e){const t=this.__external_address,n=e.address;o.mono_wasm_cop...
    method copy_from_address (line 3) | copy_from_address(e){const t=this.__external_address;o.mono_wasm_copy_...
    method copy_to_address (line 3) | copy_to_address(e){const t=this.__external_address;o.mono_wasm_copy_ma...
    method value (line 3) | get value(){return this.get()}
    method value (line 3) | set value(e){this.set(e)}
    method valueOf (line 3) | valueOf(){throw new Error("Implicit conversion of roots to pointers is...
    method clear (line 3) | clear(){K()[this.__external_address>>>2]=0}
    method release (line 3) | release(){pe.length<128&&pe.push(this)}
    method toString (line 3) | toString(){return`[external root @${this.address}]`}
  function Te (line 3) | function Te(e){if(void 0===ke){const t=Xe.lengthBytesUTF8(e),n=new Uint8...
  function xe (line 3) | function xe(e){const t=Y();return function(e,t,n){const r=t+n;let o=t;fo...
  function Ie (line 3) | function Ie(e,t){if(be){const n=Ne(Y(),e,t);return be.decode(n)}return A...
  function Ae (line 3) | function Ae(e,t){let n="";const r=Z();for(let o=e;o<t;o+=2){const e=r[o>...
  function je (line 3) | function je(e,t,n){const r=Z(),o=n.length;for(let s=0;s<o&&(y(r,e,n.char...
  function $e (line 3) | function $e(e){const t=2*(e.length+1),n=Xe._malloc(t);return _(n,2*e.len...
  function Le (line 3) | function Le(e){if(e.value===l)return null;const t=he+0,n=he+4,r=he+8;let...
  function Re (line 3) | function Re(e,t){let n;if("symbol"==typeof e?(n=e.description,"string"!=...
  function Be (line 3) | function Be(e,t){const n=2*(e.length+1),r=Xe._malloc(n);je(r,r+n,e),o.mo...
  function Ne (line 3) | function Ne(e,t,n){return e.buffer,e.subarray(t,n)}
  function Ce (line 3) | function Ce(e){if(e===l)return null;Se.value=e;const t=Le(Se);return Se....
  function De (line 3) | function De(e){if(ot.diagnosticTracing){const t="function"==typeof e?e()...
  function Fe (line 3) | function Fe(e,...t){console.info(Oe+e,...t)}
  function Me (line 3) | function Me(e,...t){console.warn(Oe+e,...t)}
  function Pe (line 3) | function Pe(e,...t){if(t&&t.length>0&&t[0]&&"object"==typeof t[0]){if(t[...
  function We (line 3) | function We(e){try{if(Ge(),0==Ve.size)return e;const t=e;for(let n=0;n<H...
  function qe (line 3) | function qe(e){let t;return t="string"==typeof e?e:null==e||void 0===e.s...
  function Ge (line 3) | function Ge(){if(!ze)return;He.push(/at (?<replaceSection>[^:()]+:wasm-f...
  function Je (line 3) | function Je(){return Ge(),[...Ve.values()]}
  function ct (line 3) | function ct(e,t){ot.emscriptenBuildOptions=t,e.isPThread,ot.quit=e.quit_...
  function lt (line 3) | function lt(e){if(it)throw new Error("Runtime module already loaded");it...
  function pt (line 3) | function pt(e,t){return st.createPromiseController(e,t)}
  function ut (line 3) | function ut(e,t){if(e)return;const n="Assert failed: "+("function"==type...
  function dt (line 3) | function dt(e,t,n){const r=function(e,t,n){let r,o=0;r=e.length-o;const ...
  function mono_wasm_fire_debugger_agent_message_with_data_to_pause (line 3) | function mono_wasm_fire_debugger_agent_message_with_data_to_pause(e){con...
  function kt (line 3) | function kt(e){e.length>wt&&(mt&&Xe._free(mt),wt=Math.max(e.length,wt,25...
  function St (line 3) | function St(e,t,n,r,s,a,i){kt(r),o.mono_wasm_send_dbg_command_with_parms...
  function vt (line 3) | function vt(e,t,n,r){kt(r),o.mono_wasm_send_dbg_command(e,t,n,mt,r.lengt...
  function Ut (line 3) | function Ut(){const{res_ok:e,res:t}=_t.remove(0);if(!e)throw new Error("...
  function Et (line 3) | function Et(){}
  function Tt (line 3) | function Tt(){o.mono_wasm_set_is_debugger_attached(!1)}
  function xt (line 3) | function xt(e){o.mono_wasm_change_debugger_log_level(e)}
  function It (line 3) | function It(e,t={}){if("object"!=typeof e)throw new Error(`event must be...
  function At (line 3) | function At(){-1==ot.waitForDebugger&&(ot.waitForDebugger=1),o.mono_wasm...
  function jt (line 3) | function jt(e){if(null!=e.arguments&&!Array.isArray(e.arguments))throw n...
  function $t (line 3) | function $t(e,t={}){return function(e,t){if(!(e in bt))throw new Error(`...
  function Lt (line 3) | function Lt(e){const t="dotnet:cfo_res:"+yt++;return bt[t]=e,t}
  function Rt (line 3) | function Rt(e){e in bt&&delete bt[e]}
  function Bt (line 3) | function Bt(){if(ot.enablePerfMeasure)return globalThis.performance.now()}
  function Nt (line 3) | function Nt(e,t,n){if(ot.enablePerfMeasure&&e){const r=tt?{start:e}:{sta...
  function Dt (line 3) | function Dt(e,t,n){if(0===t||1===t||2===t||26===t)return;let r,o,s,a;o=Y...
  function Ft (line 3) | function Ft(e){if(0===e||1===e)return;const t=yn.get(e);return t&&"funct...
  function Mt (line 3) | function Mt(e){return 0==Dn(e)?null:function(e){return e||ut(!1,"Null ar...
  function Pt (line 3) | function Pt(e){return 0==Dn(e)?null:function(e){return e||ut(!1,"Null ar...
  function Vt (line 3) | function Vt(e){return 0==Dn(e)?null:function(e){return e||ut(!1,"Null ar...
  function zt (line 3) | function zt(e){return 0==Dn(e)?null:function(e){return e||ut(!1,"Null ar...
  function Ht (line 3) | function Ht(e){return 0==Dn(e)?null:function(e){return e||ut(!1,"Null ar...
  function Wt (line 3) | function Wt(e){return 0==Dn(e)?null:function(e){return e||ut(!1,"Null ar...
  function qt (line 3) | function qt(e){return 0==Dn(e)?null:function(e){return e||ut(!1,"Null ar...
  function Gt (line 3) | function Gt(e){return 0==Dn(e)?null:function(e){return e||ut(!1,"Null ar...
  function Jt (line 3) | function Jt(e){return 0==Dn(e)?null:function(e){return e||ut(!1,"Null ar...
  function Xt (line 3) | function Xt(e){return 0==Dn(e)?null:Pn(e)}
  function Qt (line 3) | function Qt(){return null}
  function Yt (line 3) | function Yt(e){return 0===Dn(e)?null:function(e){e||ut(!1,"Null arg");co...
  function Zt (line 3) | function Zt(e,t,n,r,o,s){if(0===Dn(e))return null;const a=Jn(e);let i=Vr...
  class Kt (line 3) | class Kt{constructor(e,t){this.promise=e,this.resolve_or_reject=t}}
    method constructor (line 3) | constructor(e,t){this.promise=e,this.resolve_or_reject=t}
  function en (line 3) | function en(e,t,n){const r=Dn(e);30==r&&ut(!1,"Unexpected Task type: Tas...
  function tn (line 3) | function tn(e,t,n){const r=on(n);return Gn(e,Cr(r)),Mn(e,30),r.promise}
  function nn (line 3) | function nn(e,t,n){const r=In(e,1),o=Dn(r);if(30===o)return n;Or(Cr(n));...
  function rn (line 3) | function rn(e,t,n){if(0===t)return null;if(29===t)return Promise.reject(...
  function on (line 3) | function on(e){const{promise:t,promise_control:n}=st.createPromiseContro...
  function sn (line 3) | function sn(e){if(0==Dn(e))return null;{const t=Qn(e);try{return Le(t)}f...
  function an (line 3) | function an(e){const t=Dn(e);if(0==t)return null;if(27==t)return Nr(qn(e...
  function cn (line 3) | function cn(e){if(0==Dn(e))return null;const t=qn(e),n=Nr(t);return void...
  function ln (line 3) | function ln(e){const t=Dn(e);if(0==t)return null;if(13==t)return Nr(qn(e...
  function pn (line 3) | function pn(e,t){return t||ut(!1,"Expected valid element_type parameter"...
  function un (line 3) | function un(e,t){if(0==Dn(e))return null;-1==Kn(t)&&ut(!1,`Element type ...
  function dn (line 3) | function dn(e,t){t||ut(!1,"Expected valid element_type parameter");const...
  function fn (line 3) | function fn(e,t){t||ut(!1,"Expected valid element_type parameter");const...
  function hn (line 3) | function hn(e,t,n,r){if(dr(),o.mono_wasm_invoke_jsexport(t,n),An(n))thro...
  function gn (line 3) | function gn(e,t){if(dr(),o.mono_wasm_invoke_jsexport(e,t),An(t))throw an...
  function bn (line 3) | function bn(e){const t=o.mono_wasm_assembly_find_method(ot.runtime_inter...
  function xn (line 3) | function xn(e){const t=Un*e,n=Xe.stackAlloc(t);return _(n,t),n}
  function In (line 3) | function In(e,t){return e||ut(!1,"Null args"),e+t*Un}
  function An (line 3) | function An(e){return e||ut(!1,"Null args"),0!==Dn(e)}
  function jn (line 3) | function jn(e,t){return e||ut(!1,"Null signatures"),e+t*En+Tn}
  function $n (line 3) | function $n(e){return e||ut(!1,"Null sig"),R(e+0)}
  function Ln (line 3) | function Ln(e){return e||ut(!1,"Null sig"),R(e+16)}
  function Rn (line 3) | function Rn(e){return e||ut(!1,"Null sig"),R(e+20)}
  function Bn (line 3) | function Bn(e){return e||ut(!1,"Null sig"),R(e+24)}
  function Nn (line 3) | function Nn(e){return e||ut(!1,"Null sig"),R(e+28)}
  function Cn (line 3) | function Cn(e){return e||ut(!1,"Null signatures"),P(e+4)}
  function On (line 3) | function On(e){return e||ut(!1,"Null signatures"),P(e+0)}
  function Dn (line 3) | function Dn(e){return e||ut(!1,"Null arg"),R(e+12)}
  function Fn (line 3) | function Fn(e){return e||ut(!1,"Null arg"),R(e+13)}
  function Mn (line 3) | function Mn(e,t){e||ut(!1,"Null arg"),g(e+12,t)}
  function Pn (line 3) | function Pn(e){return e||ut(!1,"Null arg"),P(e)}
  function Vn (line 3) | function Vn(e,t){if(e||ut(!1,"Null arg"),"boolean"!=typeof t)throw new E...
  function zn (line 3) | function zn(e,t){e||ut(!1,"Null arg"),v(e,t)}
  function Hn (line 3) | function Hn(e,t){e||ut(!1,"Null arg"),A(e,t.getTime())}
  function Wn (line 3) | function Wn(e,t){e||ut(!1,"Null arg"),A(e,t)}
  function qn (line 3) | function qn(e){return e||ut(!1,"Null arg"),P(e+4)}
  function Gn (line 3) | function Gn(e,t){e||ut(!1,"Null arg"),v(e+4,t)}
  function Jn (line 3) | function Jn(e){return e||ut(!1,"Null arg"),P(e+4)}
  function Xn (line 3) | function Xn(e,t){e||ut(!1,"Null arg"),v(e+4,t)}
  function Qn (line 3) | function Qn(e){return e||ut(!1,"Null arg"),function(e){let t;if(!e)throw...
  function Yn (line 3) | function Yn(e){return e||ut(!1,"Null arg"),P(e+8)}
  function Zn (line 3) | function Zn(e,t){e||ut(!1,"Null arg"),v(e+8,t)}
  class ManagedObject (line 3) | class ManagedObject{dispose(){Fr(this,p)}get isDisposed(){return this[Lr...
    method dispose (line 3) | dispose(){Fr(this,p)}
    method isDisposed (line 3) | get isDisposed(){return this[Lr]===p}
    method toString (line 3) | toString(){return`CsObject(gc_handle: ${this[Lr]})`}
  class ManagedError (line 3) | class ManagedError extends Error{constructor(e){super(e),this.superStack...
    method constructor (line 3) | constructor(e){super(e),this.superStack=Object.getOwnPropertyDescripto...
    method getSuperStack (line 3) | getSuperStack(){if(this.superStack){if(void 0!==this.superStack.value)...
    method getManageStack (line 3) | getManageStack(){if(this.managed_stack)return this.managed_stack;if(!s...
    method dispose (line 3) | dispose(){Fr(this,p)}
    method isDisposed (line 3) | get isDisposed(){return this[Lr]===p}
  function Kn (line 3) | function Kn(e){return 4==e?1:7==e?4:8==e||10==e?8:15==e||14==e||13==e?Un...
  class er (line 3) | class er{constructor(e,t,n){this._pointer=e,this._length=t,this._viewTyp...
    method constructor (line 3) | constructor(e,t,n){this._pointer=e,this._length=t,this._viewType=n}
    method _unsafe_create_view (line 3) | _unsafe_create_view(){const e=0==this._viewType?new Uint8Array(Y().buf...
    method set (line 3) | set(e,t){if(this.isDisposed)throw new Error("Assert failed: ObjectDisp...
    method copyTo (line 3) | copyTo(e,t){if(this.isDisposed)throw new Error("Assert failed: ObjectD...
    method slice (line 3) | slice(e,t){if(this.isDisposed)throw new Error("Assert failed: ObjectDi...
    method length (line 3) | get length(){if(this.isDisposed)throw new Error("Assert failed: Object...
    method byteLength (line 3) | get byteLength(){if(this.isDisposed)throw new Error("Assert failed: Ob...
  class Span (line 3) | class Span extends er{constructor(e,t,n){super(e,t,n),this.is_disposed=!...
    method constructor (line 3) | constructor(e,t,n){super(e,t,n),this.is_disposed=!1}
    method dispose (line 3) | dispose(){this.is_disposed=!0}
    method isDisposed (line 3) | get isDisposed(){return this.is_disposed}
  class ArraySegment (line 3) | class ArraySegment extends er{constructor(e,t,n){super(e,t,n)}dispose(){...
    method constructor (line 3) | constructor(e,t,n){super(e,t,n)}
    method dispose (line 3) | dispose(){Fr(this,p)}
    method isDisposed (line 3) | get isDisposed(){return this[Lr]===p}
  function nr (line 3) | function nr(e){const t=e.args_count,r=e.arg_marshalers,o=e.res_converter...
  function rr (line 3) | function rr(e,t){pr.set(e,t),st.diagnosticTracing&&De(`added module impo...
  function or (line 3) | function or(e,t,n){if(!e)throw new Error("Assert failed: Null reference"...
  function sr (line 3) | function sr(e,t){if(!e)throw new Error("Assert failed: Null reference");...
  function ar (line 3) | function ar(e,t){if(!e)throw new Error("Assert failed: Null reference");...
  function ir (line 3) | function ir(e,t){if(!e)throw new Error("Assert failed: Null reference");...
  function cr (line 3) | function cr(){return globalThis}
  function ur (line 3) | function ur(e,t){dr(),e&&"string"==typeof e||ut(!1,"module_name must be ...
  function dr (line 3) | function dr(){st.assert_runtime_running(),ot.mono_wasm_bindings_is_ready...
  function fr (line 3) | function fr(e){e()}
  function mr (line 3) | function mr(e){return _r?new WeakRef(e):function(e){return{deref:()=>e,d...
  function hr (line 3) | function hr(e,t,n,r,o,s,a){const i=`[${t}] ${n}.${r}:${o}`,c=Bt();st.dia...
  function gr (line 3) | function gr(e){const t=e.args_count,n=e.arg_marshalers,r=e.res_converter...
  function yr (line 3) | async function yr(e){return dr(),br.get(e)||await function(e){st.assert_...
  function Ar (line 3) | function Ar(e){return e<-1}
  function jr (line 3) | function jr(e){return e>0}
  function $r (line 3) | function $r(e){return e<-1}
  function Nr (line 3) | function Nr(e){return jr(e)?Sr[e]:Ar(e)?vr[0-e]:null}
  function Cr (line 3) | function Cr(e){if(dr(),e[Rr])return e[Rr];const t=Ur.length?Ur.pop():Er+...
  function Or (line 3) | function Or(e){let t;jr(e)?(t=Sr[e],Sr[e]=void 0,Ur.push(e)):Ar(e)&&(t=v...
  function Dr (line 3) | function Dr(e,t){dr(),e[Lr]=t,wr&&kr.register(e,t,e);const n=mr(e);Tr.se...
  function Fr (line 3) | function Fr(e,t,r){var o;dr(),e&&(t=e[Lr],e[Lr]=p,wr&&kr.unregister(e)),...
  function Mr (line 3) | function Mr(e){const t=e[Lr];if(t==p)throw new Error("Assert failed: Obj...
  function Pr (line 3) | function Pr(e){st.is_runtime_running()&&Fr(null,e)}
  function Vr (line 3) | function Vr(e){if(!e)return null;const t=Tr.get(e);return t?t.deref():null}
  function Hr (line 3) | function Hr(e,t){let n=!1,r=!1;zr=!0;let o=0,s=0,a=0,i=0;const c=[...Tr....
  function Wr (line 3) | function Wr(e){return Promise.resolve(e)===e||("object"==typeof e||"func...
  function qr (line 3) | function qr(e){const{promise:t,promise_control:n}=pt();return e().then((...
  class Jr (line 3) | class Jr extends ManagedObject{constructor(e,t,n,r){super(),this.promise...
    method constructor (line 3) | constructor(e,t,n,r){super(),this.promise=e,this.gc_handle=t,this.prom...
    method setIsResolving (line 3) | setIsResolving(){return!0}
    method resolve (line 3) | resolve(e){st.is_runtime_running()?(this.isResolved&&ut(!1,"resolve co...
    method reject (line 3) | reject(e){st.is_runtime_running()?(e||(e=new Error),this.isResolved&&u...
    method cancel (line 3) | cancel(){if(st.is_runtime_running())if(this.isResolved&&ut(!1,"cancel ...
    method complete_task_wrapper (line 3) | complete_task_wrapper(e,t){try{this.isPosted&&ut(!1,"Promise is alread...
  function Qr (line 3) | function Qr(e,t,n){if(0===t||1===t||2===t||26===t)return;let r,o,s,a;o=F...
  function Yr (line 3) | function Yr(e){if(0===e||1===e)return;const t=wn.get(e);return t&&"funct...
  function Zr (line 3) | function Zr(e,t){null==t?Mn(e,0):(Mn(e,3),Vn(e,t))}
  function Kr (line 3) | function Kr(e,t){null==t?Mn(e,0):(Mn(e,4),function(e,t){e||ut(!1,"Null a...
  function eo (line 3) | function eo(e,t){null==t?Mn(e,0):(Mn(e,5),function(e,t){e||ut(!1,"Null a...
  function to (line 3) | function to(e,t){null==t?Mn(e,0):(Mn(e,6),function(e,t){e||ut(!1,"Null a...
  function no (line 3) | function no(e,t){null==t?Mn(e,0):(Mn(e,7),function(e,t){e||ut(!1,"Null a...
  function ro (line 3) | function ro(e,t){null==t?Mn(e,0):(Mn(e,8),function(e,t){if(e||ut(!1,"Nul...
  function oo (line 3) | function oo(e,t){null==t?Mn(e,0):(Mn(e,9),function(e,t){e||ut(!1,"Null a...
  function so (line 3) | function so(e,t){null==t?Mn(e,0):(Mn(e,10),Wn(e,t))}
  function ao (line 3) | function ao(e,t){null==t?Mn(e,0):(Mn(e,11),function(e,t){e||ut(!1,"Null ...
  function io (line 3) | function io(e,t){null==t?Mn(e,0):(Mn(e,12),zn(e,t))}
  function co (line 3) | function co(e,t){if(null==t)Mn(e,0);else{if(!(t instanceof Date))throw n...
  function lo (line 3) | function lo(e,t){if(null==t)Mn(e,0);else{if(!(t instanceof Date))throw n...
  function po (line 3) | function po(e,t){if(null==t)Mn(e,0);else{if(Mn(e,15),"string"!=typeof t)...
  function uo (line 3) | function uo(e,t){{const n=Qn(e);try{!function(e,t){if(t.clear(),null!==e...
  function fo (line 3) | function fo(e){Mn(e,0)}
  function _o (line 3) | function _o(e,t,r,o,s,a,i){if(null==t)return void Mn(e,0);if(!(t&&t inst...
  function mo (line 3) | function mo(e,t,n,r){const o=30==Dn(e);if(null==t)return void Mn(e,0);if...
  function ho (line 3) | function ho(e,t){if(null==t)Mn(e,0);else if(t instanceof ManagedError)Mn...
  function go (line 3) | function go(e,t){if(null==t)Mn(e,0);else{if(void 0!==t[Lr])throw new Err...
  function bo (line 3) | function bo(e,t){if(null==t)Mn(e,0);else{const n=t[Lr],r=typeof t;if(voi...
  function yo (line 3) | function yo(e,t,n){n||ut(!1,"Expected valid element_type parameter"),wo(...
  function wo (line 3) | function wo(e,t,n){if(null==t)Mn(e,0);else{const r=Kn(n);-1==r&&ut(!1,`E...
  function ko (line 3) | function ko(e,t,n){if(n||ut(!1,"Expected valid element_type parameter"),...
  function So (line 3) | function So(e,t,n){n||ut(!1,"Expected valid element_type parameter");con...
  function vo (line 3) | function vo(e,t){if(4==e){if(0!=t)throw new Error("Assert failed: Expect...
  function Eo (line 3) | function Eo(e){void 0===globalThis.performance&&(globalThis.performance=...
  function To (line 3) | function To(){if("function"!=typeof globalThis.fetch||"function"!=typeof...
  function Ao (line 3) | function Ao(){if(void 0!==xo)return xo;if("undefined"!=typeof Request&&"...
  function jo (line 3) | function jo(){return void 0!==Io||(Io="undefined"!=typeof Response&&"bod...
  function $o (line 3) | function $o(){return To(),dr(),{abortController:new AbortController}}
  function Lo (line 3) | function Lo(e){e.catch((e=>{e&&"AbortError"!==e&&"AbortError"!==e.name&&...
  function Ro (line 3) | function Ro(e){try{e.isAborted||(e.streamWriter&&(Lo(e.streamWriter.abor...
  function Bo (line 3) | function Bo(e,t,n){n>0||ut(!1,"expected bufferLength > 0");const r=new S...
  function No (line 3) | function No(e){return e||ut(!1,"expected controller"),qr((async()=>{e.st...
  function Co (line 3) | function Co(e,t,n,r,o,s){const a=new TransformStream;return e.streamWrit...
  function Oo (line 3) | function Oo(e,t,n,r,o,s,a,i){return Do(e,t,n,r,o,s,new Span(a,i,0).slice...
  function Do (line 3) | function Do(e,t,n,r,o,s,a){To(),dr(),t&&"string"==typeof t||ut(!1,"expec...
  function Fo (line 3) | function Fo(e){var t;return null===(t=e.response)||void 0===t?void 0:t.t...
  function Mo (line 3) | function Mo(e){var t,n;return null!==(n=null===(t=e.response)||void 0===...
  function Po (line 3) | function Po(e){return e.responseHeaderNames||ut(!1,"expected responseHea...
  function Vo (line 3) | function Vo(e){return e.responseHeaderValues||ut(!1,"expected responseHe...
  function zo (line 3) | function zo(e){return qr((async()=>{const t=await e.response.arrayBuffer...
  function Ho (line 3) | function Ho(e,t){if(e||ut(!1,"expected controller"),e.responseBuffer||ut...
  function Wo (line 3) | function Wo(e,t,n){const r=new Span(t,n,0);return qr((async()=>{if(await...
  function Xo (line 3) | function Xo(){if(!st.isChromium)return;const e=(new Date).valueOf(),t=e+...
  function Qo (line 3) | function Qo(){if(Xe.maybeExit(),st.is_runtime_running()){try{o.mono_wasm...
  function Yo (line 3) | function Yo(){Xe.maybeExit();try{for(;Jo>0;){if(--Jo,!st.is_runtime_runn...
  function mono_wasm_schedule_timer_tick (line 3) | function mono_wasm_schedule_timer_tick(){if(Xe.maybeExit(),st.is_runtime...
  class Zo (line 3) | class Zo{constructor(){this.queue=[],this.offset=0}getLength(){return th...
    method constructor (line 3) | constructor(){this.queue=[],this.offset=0}
    method getLength (line 3) | getLength(){return this.queue.length-this.offset}
    method isEmpty (line 3) | isEmpty(){return 0==this.queue.length}
    method enqueue (line 3) | enqueue(e){this.queue.push(e)}
    method dequeue (line 3) | dequeue(){if(0===this.queue.length)return;const e=this.queue[this.offs...
    method peek (line 3) | peek(){return this.queue.length>0?this.queue[this.offset]:void 0}
    method drain (line 3) | drain(e){for(;this.getLength();)e(this.dequeue())}
  function ms (line 3) | function ms(e){var t,n;return e.readyState!=WebSocket.CLOSED?null!==(t=e...
  function hs (line 3) | function hs(e,t,n){let r;!function(){if(nt)throw new Error("WebSockets a...
  function gs (line 3) | function gs(e){if(e||ut(!1,"ERR17: expected ws instance"),e[as])return U...
  function bs (line 3) | function bs(e,t,n,r,o){if(e||ut(!1,"ERR17: expected ws instance"),e[as])...
  function ys (line 3) | function ys(e,t,n){if(e||ut(!1,"ERR18: expected ws instance"),e[as])retu...
  function ws (line 3) | function ws(e,t,n,r){if(e||ut(!1,"ERR19: expected ws instance"),e[ls]||e...
  function ks (line 3) | function ks(e){if(e||ut(!1,"ERR18: expected ws instance"),!e[ls]&&!e[ps]...
  function Ss (line 3) | function Ss(e,t){const n=e[os],r=e[ss];n&&r&&n.reject(t);for(const n of ...
  function vs (line 3) | function vs(e,t,n,r){const o=t.peek(),s=Math.min(r,o.data.length-o.offse...
  function Us (line 3) | function Us(e){return function(e){const{promise:t,promise_control:n}=pt(...
  function Es (line 3) | function Es(e,t,n){st.diagnosticTracing&&De(`Loaded:${e.name} as ${e.beh...
  function Ts (line 3) | async function Ts(e){try{const n=await e.pendingDownloadInternal.respons...
  function xs (line 3) | async function xs(e){try{const t=await e.pendingDownloadInternal.respons...
  function Is (line 3) | function Is(){return st.loadedFiles}
  function js (line 3) | function js(e){let t=As[e];if("string"!=typeof t){const n=o.mono_jiterp_...
  class Ns (line 3) | class Ns{constructor(e){this.locals=new Map,this.permanentFunctionTypeCo...
    method constructor (line 3) | constructor(e){this.locals=new Map,this.permanentFunctionTypeCount=0,t...
    method clear (line 3) | clear(e){this.options=pa(),this.stackSize=1,this.inSection=!1,this.inF...
    method _push (line 3) | _push(){this.stackSize++,this.stackSize>=this.stack.length&&this.stack...
    method _pop (line 3) | _pop(e){if(this.stackSize<=1)throw new Error("Stack empty");const t=th...
    method setImportFunction (line 3) | setImportFunction(e,t){const n=this.importedFunctions[e];if(!n)throw n...
    method getExceptionTag (line 3) | getExceptionTag(){const e=Xe.wasmExports.__cpp_exception;return void 0...
    method getWasmImports (line 3) | getWasmImports(){const e=ot.getMemory();e instanceof WebAssembly.Memor...
    method bytesGeneratedSoFar (line 3) | get bytesGeneratedSoFar(){const e=this.compressImportNames?8:20;return...
    method current (line 3) | get current(){return this.stack[this.stackSize-1]}
    method size (line 3) | get size(){return this.current.size}
    method appendU8 (line 3) | appendU8(e){if(e!=e>>>0||e>255)throw new Error(`Byte out of range: ${e...
    method appendSimd (line 3) | appendSimd(e,t){return this.current.appendU8(253),0|e||0===e&&!0===t||...
    method appendAtomic (line 3) | appendAtomic(e,t){return this.current.appendU8(254),0|e||0===e&&!0===t...
    method appendU32 (line 3) | appendU32(e){return this.current.appendU32(e)}
    method appendF32 (line 3) | appendF32(e){return this.current.appendF32(e)}
    method appendF64 (line 3) | appendF64(e){return this.current.appendF64(e)}
    method appendBoundaryValue (line 3) | appendBoundaryValue(e,t){return this.current.appendBoundaryValue(e,t)}
    method appendULeb (line 3) | appendULeb(e){return this.current.appendULeb(e)}
    method appendLeb (line 3) | appendLeb(e){return this.current.appendLeb(e)}
    method appendLebRef (line 3) | appendLebRef(e,t){return this.current.appendLebRef(e,t)}
    method appendBytes (line 3) | appendBytes(e){return this.current.appendBytes(e)}
    method appendName (line 3) | appendName(e){return this.current.appendName(e)}
    method ret (line 3) | ret(e){this.ip_const(e),this.appendU8(15)}
    method i32_const (line 3) | i32_const(e){this.appendU8(65),this.appendLeb(e)}
    method ptr_const (line 3) | ptr_const(e){let t=this.options.useConstants?this.constantSlots.indexO...
    method ip_const (line 3) | ip_const(e){this.appendU8(65),this.appendLeb(e-this.base)}
    method i52_const (line 3) | i52_const(e){this.appendU8(66),this.appendLeb(e)}
    method v128_const (line 3) | v128_const(e){if(0===e)this.local("v128_zero");else{if("object"!=typeo...
    method defineType (line 3) | defineType(e,t,n,r){if(this.functionTypes[e])throw new Error(`Function...
    method generateTypeSection (line 3) | generateTypeSection(){this.beginSection(1),this.appendULeb(this.functi...
    method getImportedFunctionTable (line 3) | getImportedFunctionTable(){const e={};for(const t in this.importedFunc...
    method getCompressedName (line 3) | getCompressedName(e){if(!this.compressImportNames||"number"!=typeof e....
    method getImportsToEmit (line 3) | getImportsToEmit(){const e=[];for(const t in this.importedFunctions){c...
    method _generateImportSection (line 3) | _generateImportSection(e){const t=this.getImportsToEmit();if(this.lock...
    method defineImportedFunction (line 3) | defineImportedFunction(e,t,n,r,o){if(this.lockImports)throw new Error(...
    method markImportAsUsed (line 3) | markImportAsUsed(e){const t=this.importedFunctions[e];if(!t)throw new ...
    method getTypeIndex (line 3) | getTypeIndex(e){const t=this.functionTypes[e];if(!t)throw new Error("N...
    method defineFunction (line 3) | defineFunction(e,t){const n={index:this.functions.length,name:e.name,t...
    method emitImportsAndFunctions (line 3) | emitImportsAndFunctions(e){let t=0;for(let e=0;e<this.functions.length...
    method call_indirect (line 3) | call_indirect(){throw new Error("call_indirect unavailable")}
    method callImport (line 3) | callImport(e){const t=this.importedFunctions[e];if(!t)throw new Error(...
    method beginSection (line 3) | beginSection(e){this.inSection&&this._pop(!0),this.appendU8(e),this._p...
    method endSection (line 3) | endSection(){if(!this.inSection)throw new Error("Not in section");this...
    method _assignLocalIndices (line 3) | _assignLocalIndices(e,t,n,r){e[127]=0,e[126]=0,e[125]=0,e[124]=0,e[123...
    method beginFunction (line 3) | beginFunction(e,t){if(this.inFunction)throw new Error("Already in func...
    method endFunction (line 3) | endFunction(e){if(!this.inFunction)throw new Error("Not in function");...
    method block (line 3) | block(e,t){const n=this.appendU8(t||2);return e?this.appendU8(e):this....
    method endBlock (line 3) | endBlock(){if(this.activeBlocks<=0)throw new Error("No blocks active")...
    method arg (line 3) | arg(e,t){const n="string"==typeof e?this.locals.has(e)?this.locals.get...
    method local (line 3) | local(e,t){const n="string"==typeof e?this.locals.has(e)?this.locals.g...
    method appendMemarg (line 3) | appendMemarg(e,t){this.appendULeb(t),this.appendULeb(e)}
    method lea (line 3) | lea(e,t){"string"==typeof e?this.local(e):this.i32_const(e),this.i32_c...
    method getArrayView (line 3) | getArrayView(e){if(this.stackSize>1)throw new Error("Jiterpreter block...
    method getConstants (line 3) | getConstants(){const e={};for(let t=0;t<this.constantSlots.length;t++)...
  class Cs (line 3) | class Cs{constructor(){this.textBuf=new Uint8Array(1024),this.capacity=1...
    method constructor (line 3) | constructor(){this.textBuf=new Uint8Array(1024),this.capacity=16384,th...
    method clear (line 3) | clear(){this.size=0}
    method appendU8 (line 3) | appendU8(e){if(this.size>=this.capacity)throw new Error("Buffer full")...
    method appendU32 (line 3) | appendU32(e){const t=this.size;return o.mono_jiterp_write_number_unali...
    method appendI32 (line 3) | appendI32(e){const t=this.size;return o.mono_jiterp_write_number_unali...
    method appendF32 (line 3) | appendF32(e){const t=this.size;return o.mono_jiterp_write_number_unali...
    method appendF64 (line 3) | appendF64(e){const t=this.size;return o.mono_jiterp_write_number_unali...
    method appendBoundaryValue (line 3) | appendBoundaryValue(e,t){if(this.size+8>=this.capacity)throw new Error...
    method appendULeb (line 3) | appendULeb(e){if("number"!=typeof e&&ut(!1,`appendULeb expected number...
    method appendLeb (line 3) | appendLeb(e){if("number"!=typeof e&&ut(!1,`appendLeb expected number b...
    method appendLebRef (line 3) | appendLebRef(e,t){if(this.size+8>=this.capacity)throw new Error("Buffe...
    method copyTo (line 3) | copyTo(e,t){"number"!=typeof t&&(t=this.size),Y().copyWithin(e.buffer+...
    method appendBytes (line 3) | appendBytes(e,t){const n=this.size,r=Y();return e.buffer===r.buffer?("...
    method appendName (line 3) | appendName(e){let t=e.length,n=1===e.length?e.charCodeAt(0):-1;if(n>12...
    method getArrayView (line 3) | getArrayView(e){return new Uint8Array(Y().buffer,this.buffer,e?this.ca...
  class Os (line 3) | class Os{constructor(e){this.segments=[],this.backBranchTargets=null,thi...
    method constructor (line 3) | constructor(e){this.segments=[],this.backBranchTargets=null,this.lastS...
    method initialize (line 3) | initialize(e,t,n){this.segments.length=0,this.blockStack.length=0,this...
    method entry (line 3) | entry(e){this.entryIp=e;const t=o.mono_jiterp_get_opcode_info(675,1);r...
    method appendBlob (line 3) | appendBlob(){this.builder.current.size!==this.lastSegmentEnd&&(this.se...
    method startBranchBlock (line 3) | startBranchBlock(e,t){this.appendBlob(),this.segments.push({type:"bran...
    method branch (line 3) | branch(e,t,n){t&&this.observedBackBranchTargets.add(e),this.appendBlob...
    method emitBlob (line 3) | emitBlob(e,t){const n=t.subarray(e.start,e.start+e.length);this.builde...
    method generate (line 3) | generate(){this.appendBlob();const e=this.builder.endFunction(!1);this...
  function Ps (line 3) | function Ps(e,t,n){e.ip_const(t),e.options.countBailouts&&(e.i32_const(e...
  function Vs (line 3) | function Vs(e,t,n,r){e.local("cinfo"),e.block(64,4),e.local("cinfo"),e.l...
  function zs (line 3) | function zs(){if(Ds||(Ds=ot.getWasmIndirectFunctionTable()),!Ds)throw ne...
  function Hs (line 3) | function Hs(e,t){t||ut(!1,"Attempting to set null function into table");...
  function Ws (line 3) | function Ws(e,t,n,r,o){if(r<=0)return o&&e.appendU8(26),!0;if(r>=Ls)retu...
  function qs (line 3) | function qs(e,t,n){Ws(e,0,0,n,!0)||(e.i32_const(t),e.i32_const(n),e.appe...
  function Gs (line 3) | function Gs(e,t,n,r,o,s,a){if(r<=0)return o&&(e.appendU8(26),e.appendU8(...
  function Js (line 3) | function Js(e,t){return Gs(e,0,0,t,!0)||(e.i32_const(t),e.appendU8(252),...
  function Xs (line 3) | function Xs(){const e=la(5,1);e>=$s&&(Fe(`Disabling jiterpreter after ${...
  function Ys (line 3) | function Ys(e){const t=Qs[e];return void 0===t?Qs[e]=o.mono_jiterp_get_m...
  function Zs (line 3) | function Zs(e){const t=Xe.wasmExports[e];if("function"!=typeof t)throw n...
  function ea (line 3) | function ea(e){let t=Ks[e];return"number"!=typeof t&&(t=Ks[e]=o.mono_jit...
  function ta (line 3) | function ta(e,t){return[e,e,t]}
  function ra (line 3) | function ra(){if(!o.mono_wasm_is_zero_page_reserved())return!1;if(!0===n...
  function ia (line 3) | function ia(e){for(const t in e){const n=oa[t];if(!n){Pe(`Unrecognized j...
  function ca (line 3) | function ca(e){return o.mono_jiterp_get_counter(e)}
  function la (line 3) | function la(e,t){return o.mono_jiterp_modify_counter(e,t)}
  function pa (line 3) | function pa(){const e=o.mono_jiterp_get_options_version();return e!==sa&...
  function ua (line 3) | function ua(e,t,n,r){const s=zs(),a=t,i=a+n-1;return i<s.length||ut(!1,`...
  function Ba (line 3) | function Ba(e,t){return B(e+2*t)}
  function Na (line 3) | function Na(e,t){return M(e+2*t)}
  function Ca (line 3) | function Ca(e,t){return O(e+2*t)}
  function Oa (line 3) | function Oa(e){return D(e+Ys(4))}
  function Da (line 3) | function Da(e,t){const n=D(Oa(e)+Ys(5));return D(n+t*fc)}
  function Fa (line 3) | function Fa(e,t){const n=D(Oa(e)+Ys(12));return D(n+t*fc)}
  function Ma (line 3) | function Ma(e,t,n){if(!n)return!1;for(let r=0;r<n.length;r++)if(2*n[r]+t...
  function Va (line 3) | function Va(e,t){if(!oi(e,t))return Pa.get(t)}
  function za (line 3) | function za(e,t){const n=Va(e,t);if(void 0!==n)switch(n.type){case"i32":...
  function Ga (line 3) | function Ga(){qa=-1,Ha.clear(),Pa.clear()}
  function Ja (line 3) | function Ja(e){qa===e&&(qa=-1),Ha.delete(e),Pa.delete(e)}
  function Xa (line 3) | function Xa(e,t){for(let n=0;n<t;n+=1)Ja(e+n)}
  function Qa (line 3) | function Qa(e,t,n){e.cfg.startBranchBlock(t,n)}
  function Ya (line 3) | function Ya(e,t,n){let r=0;switch(e%16==0?r=4:e%8==0?r=3:e%4==0?r=2:e%2=...
  function Za (line 3) | function Za(e,t,n,r,o){if(e.options.cprop&&40===n){const n=Va(e,t);if(n)...
  function Ka (line 3) | function Ka(e,t,n,r){if(Za(e,t,n,!1))return;if(e.local("pLocals"),n>=40|...
  function ei (line 3) | function ei(e,t,n,r){n>=54||ut(!1,`Expected store opcode but got ${n}`),...
  function ti (line 3) | function ti(e,t,n){"number"!=typeof n&&(n=512),n>0&&Xa(t,n),e.lea("pLoca...
  function ni (line 3) | function ni(e,t,n,r){Xa(t,r),Ws(e,t,0,r,!1)||(ti(e,t,r),qs(e,n,r))}
  function ri (line 3) | function ri(e,t,n,r){if(Xa(t,r),Gs(e,t,n,r,!1))return!0;ti(e,t,r),ti(e,n...
  function oi (line 3) | function oi(e,t){return 0!==o.mono_jiterp_is_imethod_var_address_taken(O...
  function si (line 3) | function si(e,t,n,r){if(e.allowNullCheckOptimization&&Ha.has(t)&&!oi(e,t...
  function ai (line 3) | function ai(e,t,n){let r,s=54;const a=ma[n];if(a)e.local("pLocals"),e.ap...
  function ii (line 3) | function ii(e,t,n){let r=40,o=54;switch(n){case 74:r=44;break;case 75:r=...
  function ci (line 3) | function ci(e,t,n,r){const o=r>=23&&r<=36||r>=50&&r<=60,s=Ba(n,o?2:1),a=...
  function li (line 3) | function li(e,t,n,r){const o=r>=23&&r<=36||r>=50&&r<=60,s=Ba(n,1),a=Da(t...
  function pi (line 3) | function pi(e,t,n){let r,o,s,a,i="math_lhs32",c="math_rhs32",l=!1;const ...
  function ui (line 3) | function ui(e,t,n){const r=ga[n];if(!r)return!1;const o=r[1],s=r[2];swit...
  function di (line 3) | function di(e,t,n,r){const o=133===r?t+6:t+8,s=Fa(n,B(o-2));e.local("pLo...
  function fi (line 3) | function fi(e,t){const n=o.mono_jiterp_get_opcode_info(t,4),r=e+2+2*o.mo...
  function _i (line 3) | function _i(e,t,n,r){const s=r>=227&&r<=270,a=fi(t,r);if("number"!=typeo...
  function mi (line 3) | function mi(e,t,n,r){const o=wa[r];if(!o)return!1;const s=Array.isArray(...
  function hi (line 3) | function hi(e,t,n){let r,o,s,a;const i=Ba(t,1),c=Ba(t,2),l=Ba(t,3),p=ka[...
  function gi (line 3) | function gi(e,t,n){const r=n>=87&&n<=112,o=n>=107&&n<=112,s=n>=95&&n<=10...
  function bi (line 3) | function bi(e,t,n,r,o){e.block(),Ka(e,r,40),e.local("index",34);let s="c...
  function yi (line 3) | function yi(e,t,n,r){const o=r<=328&&r>=315||341===r,s=Ba(n,o?2:1),a=Ba(...
  function wi (line 3) | function wi(){return void 0!==Wa||(Wa=!0===ot.featureWasmSimd,Wa||Fe("Di...
  function ki (line 3) | function ki(e,t,n){const r=`${t}_${n.toString(16)}`;return"object"!=type...
  function Si (line 3) | function Si(e,t,n,r,s,a){if(e.options.enableSimd&&wi())switch(s){case 2:...
  function vi (line 3) | function vi(e,t){ei(e,Ba(t,1),253,11)}
  function Ui (line 3) | function Ui(e,t,n){e.local("pLocals"),Ka(e,Ba(t,2),253,n||0)}
  function Ei (line 3) | function Ei(e,t){e.local("pLocals"),Ka(e,Ba(t,2),253,0),Ka(e,Ba(t,3),253...
  function Ti (line 3) | function Ti(e,t,n){if(!e.options.enableAtomics)return!1;const r=Sa[n];if...
  function Ri (line 3) | function Ri(){return Ai||(Ai=[ta("interp_entry_prologue",Zs("mono_jiterp...
  method constructor (line 3) | constructor(e,t,n,r,o,s,a,i){this.imethod=e,this.method=t,this.argumentC...
  method generateName (line 3) | generateName(){const e=o.mono_wasm_method_get_full_name(this.method);try...
  method getTraceName (line 3) | getTraceName(){return this.traceName||this.generateName(),this.traceName...
  method getName (line 3) | getName(){return this.name||this.generateName(),this.name||"unknown"}
  function Ci (line 3) | function Ci(){const e=[];let t=0;for(;0!=(t=o.mono_jiterp_tlqueue_next(1...
  function Oi (line 3) | function Oi(e,t,n,r,s){const a=o.mono_jiterp_type_get_raw_value_size(n),...
  function Di (line 3) | function Di(e,t){const n=Xe._malloc(xi);_(n,xi),v(n+Ys(13),t.paramTypes....
  class Ji (line 3) | class Ji{constructor(e,t,n,r,s){this.queue=[],r||ut(!1,"Expected nonzero...
    method constructor (line 3) | constructor(e,t,n,r,s){this.queue=[],r||ut(!1,"Expected nonzero arg_of...
  function Xi (line 3) | function Xi(e){let t=Wi[e];return t||(e>=Wi.length&&(Wi.length=e+1),Vi||...
  function Qi (line 3) | function Qi(){const e=[];let t=0;for(;0!=(t=o.mono_jiterp_tlqueue_next(0...
  function Ki (line 3) | function Ki(e,t,n){e.local("sp"),e.appendU8(n),e.appendMemarg(t,0)}
  function ec (line 3) | function ec(e,t){e.local("sp"),e.i32_const(t),e.appendU8(106)}
  function tc (line 3) | function tc(e,t){let n=0;e.options.enableWasmEh&&e.block(64,6),t.hasRetu...
  class ic (line 3) | class ic{constructor(e){this.name=e,this.eip=0}}
    method constructor (line 3) | constructor(e){this.name=e,this.eip=0}
  class cc (line 3) | class cc{constructor(e,t,n){this.ip=e,this.index=t,this.isVerbose=!!n}ge...
    method constructor (line 3) | constructor(e,t,n){this.ip=e,this.index=t,this.isVerbose=!!n}
    method hitCount (line 3) | get hitCount(){return o.mono_jiterp_get_trace_hit_count(this.index)}
  function Sc (line 3) | function Sc(e,t,n){if(o.mono_jiterp_trace_bailout(n),14===n)return e;con...
  function vc (line 3) | function vc(){if(gc)return gc;gc=[ta("bailout",Sc),ta("copy_ptr",Zs("mon...
  function Uc (line 3) | function Uc(e,t){const n=lc[e];if(!n)throw new Error(`Unrecognized instr...
  function Ec (line 3) | function Ec(e,t){if(!rc)throw new Error("No trace active");rc.operand1=e...
  function Tc (line 3) | function Tc(e,t,n,r){if("number"==typeof r)o.mono_jiterp_adjust_abort_co...
  function xc (line 3) | function xc(e){if(!ot.runtimeReady)return;if(oc||(oc=pa()),!oc.enableSta...
  function Ac (line 3) | async function Ac(){if(!st.is_runtime_running())return void Fe("Skipped ...
  function jc (line 3) | async function jc(){const e=await Lc(Ic);if(!e)return void Pe("Failed to...
  function $c (line 3) | async function $c(){if(tt&&!1===globalThis.window.isSecureContext)return...
  function Lc (line 3) | async function Lc(t){if(!ot.subtle)return null;const n=Object.assign({},...
  function Rc (line 3) | async function Rc(e){const t=st.config.resources.lazyAssembly;if(!t)thro...
  function Bc (line 3) | async function Bc(e){const t=st.config.resources.satelliteResources;t&&a...
  function Nc (line 3) | function Nc(e){if(e===c)return null;const t=o.mono_wasm_read_as_bool_or_...
  function Dc (line 3) | function Dc(e){if(e)try{(e=e.toLocaleLowerCase()).includes("zh")&&(e=e.r...
  function Mc (line 3) | async function Mc(e,t){try{const n=await Pc(e,t);return st.mono_exit(n),...
  function Pc (line 3) | async function Pc(e,t){null!=e&&""!==e||(e=st.config.mainAssemblyName)||...
  function Vc (line 3) | function Vc(e){ot.runtimeReady&&(ot.runtimeReady=!1,o.mono_wasm_exit(e))}
  function zc (line 3) | function zc(e){if(st.exitReason=e,ot.runtimeReady){ot.runtimeReady=!1;co...
  function Hc (line 3) | async function Hc(e){e.out||(e.out=console.log.bind(console)),e.err||(e....
  function Wc (line 3) | function Wc(e){const t=Bt();e.locateFile||(e.locateFile=e.__locateFile=e...
  function qc (line 3) | function qc(e,t){o.mono_wasm_setenv(e,t)}
  function Gc (line 3) | async function Gc(){void 0!==st.exitCode&&0!==st.exitCode||await Ac()}
  function Jc (line 3) | async function Jc(e){}
  function Qc (line 3) | function Qc(r){const o=Xe,s=r,a=globalThis;Object.assign(s.internal,{mon...
  class Yc (line 3) | class Yc{constructor(){this.list={}}registerRuntime(e){return void 0===e...
    method constructor (line 3) | constructor(){this.list={}}
    method registerRuntime (line 3) | registerRuntime(e){return void 0===e.runtimeId&&(e.runtimeId=Object.ke...
    method getRuntime (line 3) | getRuntime(e){const t=this.list[e];return t?t.deref():void 0}

FILE: docfx/AppBundle/main.js
  function initialize (line 3) | async function initialize() {

FILE: other/ContactClipping/ClipDebug.cs
  type ClipPoint (line 7) | internal readonly record struct ClipPoint(float X, float Y)
  type ClipDebugMode (line 35) | internal enum ClipDebugMode
  type ClipStep (line 43) | internal sealed record ClipStep(
  type ClipSnapshot (line 52) | internal sealed record ClipSnapshot(
  type ClipFrame (line 62) | internal sealed record ClipFrame(ClipPoint[] Left, ClipPoint[] Right);
  type ClipPreset (line 64) | internal sealed record ClipPreset(string Name, string Description, Func<...
  class ContactManifoldClipDebugger (line 66) | internal static class ContactManifoldClipDebugger
    method CreatePresets (line 103) | public static IReadOnlyList<ClipPreset> CreatePresets()
    method BuildSnapshot (line 122) | public static ClipSnapshot BuildSnapshot(ClipPreset preset, float time)
    method BuildSnapshot (line 128) | public static ClipSnapshot BuildSnapshot(string presetName, string des...
    method GetModeLabel (line 256) | public static string GetModeLabel(ClipDebugMode mode)
    method BuildPolygonClipFrame (line 267) | private static ClipFrame BuildPolygonClipFrame(float time)
    method BuildSegmentVsPolygonFrame (line 279) | private static ClipFrame BuildSegmentVsPolygonFrame(float time)
    method BuildSegmentVsSegmentFrame (line 291) | private static ClipFrame BuildSegmentVsSegmentFrame(float time)
    method Transform (line 307) | private static ClipPoint[] Transform(ClipPoint[] points, Vector2 trans...
    method Copy (line 326) | private static ClipPoint[] Copy(ClipPoint[] source, int count)
    method Cross2D (line 333) | private static float Cross2D(in ClipPoint left, in ClipPoint right)
    method SignedArea (line 338) | private static float SignedArea(ClipPoint[] polygon, int count)
    method ReversePolygon (line 354) | private static void ReversePolygon(ClipPoint[] polygon, int count)
    method NormalizeWinding (line 362) | private static void NormalizeWinding(ClipPoint[] polygon, int count)
    method CalculateClipTolerance (line 370) | private static void CalculateClipTolerance(ClipPoint[] left, int leftC...
    method CompactPolygon (line 392) | private static void CompactPolygon(ClipPoint[] polygon, ref int count,...
    method SideOfEdge (line 448) | private static float SideOfEdge(in ClipPoint edgeStart, in ClipPoint e...
    method IntersectSegmentsAgainstEdge (line 453) | private static ClipPoint IntersectSegmentsAgainstEdge(in ClipPoint edg...
    method ClipConvexPolygon (line 469) | private static int ClipConvexPolygon(ClipPoint[] subject, int subjectC...
    method StoreLinearIntersection (line 542) | private static void StoreLinearIntersection(in ClipPoint start, in Cli...
    method ClipSegmentAgainstPolygon (line 554) | private static bool ClipSegmentAgainstPolygon(in ClipPoint segmentStar...
    method IntersectSegments (line 614) | private static bool IntersectSegments(in ClipPoint leftStart, in ClipP...
    method TryClipLinearIntersection (line 688) | private static bool TryClipLinearIntersection(ClipPoint[] left, int le...
    method ReducePolygon (line 721) | private static void ReducePolygon(ClipPoint[] polygon, ref int count)

FILE: other/ContactClipping/Program.cs
  class Program (line 7) | internal static class Program
    method Main (line 30) | private static void Main()
    method HandleInput (line 63) | private static void HandleInput(int presetCount)
    method UpdateCurrentStep (line 123) | private static void UpdateCurrentStep(ClipSnapshot snapshot, float del...
    method DrawScene (line 149) | private static void DrawScene(ClipSnapshot snapshot)
    method DrawHeader (line 181) | private static void DrawHeader(ClipSnapshot snapshot)
    method DrawFooter (line 193) | private static void DrawFooter(ClipSnapshot snapshot)
    method DrawPanel (line 203) | private static void DrawPanel(Rectangle rect, string title)
    method DrawGeometryPanel (line 210) | private static void DrawGeometryPanel(Rectangle rect, WorldBounds boun...
    method DrawStepPanel (line 228) | private static void DrawStepPanel(Rectangle rect, WorldBounds bounds, ...
    method DrawResultPanel (line 248) | private static void DrawResultPanel(Rectangle rect, WorldBounds bounds...
    method DrawGrid (line 268) | private static void DrawGrid(Rectangle plot, WorldBounds bounds)
    method DrawLegend (line 281) | private static void DrawLegend(int x, int y, Color color, string text)
    method GetPlotRect (line 287) | private static Rectangle GetPlotRect(Rectangle panel)
    method DrawShape (line 292) | private static void DrawShape(Rectangle plot, WorldBounds bounds, Clip...
    method DrawEdge (line 334) | private static void DrawEdge(Rectangle plot, WorldBounds bounds, ClipP...
    method WorldToScreen (line 343) | private static Vector2 WorldToScreen(Rectangle plot, WorldBounds bound...
    method CollectBounds (line 357) | private static WorldBounds CollectBounds(ClipSnapshot snapshot, ClipSt...
    method Expand (line 385) | private static void Expand(ref WorldBounds bounds, ClipPoint point)
    method Expand (line 393) | private static void Expand(ref WorldBounds bounds, ClipPoint[] points)
    type WorldBounds (line 401) | private struct WorldBounds(float minX, float minY, float maxX, float m...

FILE: other/GodotDemo/Program.cs
  class Conversion (line 12) | public static class Conversion
    method FromJitter (line 14) | public static Vector3 FromJitter(in JVector vec) => new Vector3(vec.X,...
  class JitterCubes (line 17) | public partial class JitterCubes : MultiMeshInstance3D
    method AddCube (line 21) | public void AddCube(RigidBody body)
    method Clear (line 26) | public void Clear() => cubes.Clear();
    method _Ready (line 28) | public override void _Ready()
    method _Process (line 37) | public override void _Process(double delta)
  class Program (line 60) | public partial class Program : Node3D
    method _Ready (line 66) | public override void _Ready()
    method ResetScene (line 83) | private void ResetScene()
    method _Process (line 106) | public override void _Process(double delta)

FILE: other/GodotSoftBodies/Program.cs
  class Conversion (line 12) | public static class Conversion
    method FromJitter (line 14) | public static Vector3 FromJitter(in JVector vec) => new Vector3(vec.X,...
  class CubedSoftBody (line 17) | public class CubedSoftBody(World world) : SoftBody(world)
    type BuildVertex (line 21) | public struct BuildVertex(int x, int y, int z)
    type BuildTetrahedron (line 29) | public struct BuildTetrahedron(int a, int b, int c, int d)
    class BuildQuad (line 34) | public class BuildQuad(int a, int b, int c, int d, bool diagLeft = fal...
      method SetUvCoordinates (line 44) | public void SetUvCoordinates(BuildVertex[] vertices)
      method Equals (line 77) | public override bool Equals(object obj)
      method Equals (line 82) | public bool Equals(BuildQuad other)
      method GetHashCode (line 91) | public override int GetHashCode()
    method PushVertex (line 118) | private int PushVertex(BuildVertex vertex)
    method AddCube (line 127) | public void AddCube(int x, int y, int z)
    method Finalize (line 161) | public void Finalize(float scale = 0.25f)
  class JitterSoftBodyCubeDrawer (line 221) | public partial class JitterSoftBodyCubeDrawer : MeshInstance3D
    method Clear (line 229) | public void Clear()
    method AddCubedSoftBody (line 239) | public void AddCubedSoftBody(CubedSoftBody body)
    method _Ready (line 244) | public override void _Ready()
    method _Process (line 264) | public override void _Process(double delta)
  class Program (line 316) | public partial class Program : Node3D
    method Add2x2x2 (line 322) | private void Add2x2x2(CubedSoftBody csb, int x, int y, int z)
    method AddI (line 334) | private void AddI(int x, int y, int z)
    method AddO (line 349) | private void AddO(int x, int y, int z)
    method AddL (line 364) | private void AddL(int x, int y, int z)
    method AddZ (line 379) | private void AddZ(int x, int y, int z)
    method AddT (line 394) | private void AddT(int x, int y, int z)
    method _Ready (line 409) | public override void _Ready()
    method ResetScene (line 423) | private void ResetScene()
    method _Process (line 453) | public override void _Process(double delta)

FILE: other/WebDemo/Program.cs
  type BodyShape (line 20) | public enum BodyShape { Box, Sphere }
  type RenderTag (line 22) | public record struct RenderTag(BodyShape Shape, float Sx, float Sy, floa...
  type IScene (line 26) | public interface IScene
    method Build (line 30) | void Build(Playground pg);
  class PressurizedSphere (line 35) | sealed class PressurizedSphere : SoftBody
    class UnitSphere (line 39) | private sealed class UnitSphere : ISupportMappable
      method SupportMap (line 41) | public void SupportMap(in JVector direction, out JVector result)
      method GetCenter (line 43) | public void GetCenter(out JVector point)
    method PressurizedSphere (line 47) | public PressurizedSphere(World world, JVector center, float radius = 1...
    method WorldOnPostStep (line 96) | protected override void WorldOnPostStep(float dt)
  class SceneSoftBall (line 126) | sealed class SceneSoftBall : IScene
    method Build (line 133) | public void Build(Playground pg)
  class SceneTower (line 162) | sealed class SceneTower : IScene
    method Build (line 167) | public void Build(Playground pg)
  class SceneDominoes (line 257) | sealed class SceneDominoes : IScene
    method Build (line 269) | public void Build(Playground pg)
  class SceneJenga (line 328) | sealed class SceneJenga : IScene
    method Build (line 333) | public void Build(Playground pg)
  class SceneWreckingBall (line 361) | sealed class SceneWreckingBall : IScene
    method Build (line 371) | public void Build(Playground pg)
  class Playground (line 406) | public class Playground
    method Playground (line 450) | public Playground()
    method LoadScene (line 520) | private void LoadScene(int index)
    method AddGround (line 531) | public RigidBody AddGround(float y = 0f)
    method Dispose (line 541) | public void Dispose()
    method AddBox (line 562) | public RigidBody AddBox(JVector pos, float sx = 1f, float sy = 1f, flo...
    method AddSphere (line 572) | public RigidBody AddSphere(JVector pos, float radius = 0.5f)
    method SetTheme (line 583) | public void SetTheme(bool lightTheme)
    method UpdateFrame (line 595) | public void UpdateFrame()
    method HandleInput (line 640) | private void HandleInput()
    method HandleTabPress (line 656) | private void HandleTabPress(Vector2 pointer)
    method QueuePointerTap (line 671) | public void QueuePointerTap(float x, float y)
    method DrawGround (line 679) | private void DrawGround()
    method DrawBodies (line 685) | private void DrawBodies()
    method DrawExtras (line 705) | private void DrawExtras()
    method SelectFont (line 765) | private Font SelectFont(float size)
    method GetAtlasFontSize (line 772) | private static int GetAtlasFontSize(int uiSize)
    method DrawTextF (line 777) | private void DrawTextF(string text, float x, float y, float size, Colo...
    method MeasureTextF (line 786) | private float MeasureTextF(string text, float size)
    method DrawUI (line 794) | private void DrawUI()
    method BuildTransform (line 826) | static Matrix4x4 BuildTransform(RigidBody body, float sx, float sy, fl...
  class Application (line 840) | public partial class Application
    method UpdateFrame (line 844) | [JSExport] public static void UpdateFrame() => _playground.UpdateFrame();
    method Resize (line 845) | [JSExport] public static void Resize(int w, int h) => SetWindowSize(w,...
    method SetTheme (line 846) | [JSExport] public static void SetTheme(bool lightTheme) => _playground...
    method PointerTap (line 847) | [JSExport] public static void PointerTap(float x, float y) => _playgro...
    method Shutdown (line 848) | [JSExport] public static void Shutdown() => _playground.Dispose();
    method Main (line 850) | public static void Main() => _playground = new Playground();

FILE: other/WebDemo/RLights.cs
  type Light (line 5) | public struct Light
  type LightType (line 20) | public enum LightType
  class Rlights (line 26) | public static class Rlights
    method CreateLight (line 28) | public static Light CreateLight(
    method UpdateLightValues (line 64) | public static void UpdateLightValues(Shader shader, Light light)

FILE: other/WebDemo/main.js
  function initialize (line 3) | async function initialize() {

FILE: src/Jitter2/Attributes.cs
  type ReferenceFrame (line 14) | public enum ReferenceFrame
  class ReferenceFrameAttribute (line 23) | [AttributeUsage(AttributeTargets.All)]
    method ReferenceFrameAttribute (line 35) | public ReferenceFrameAttribute(ReferenceFrame frame)
  type ThreadContext (line 44) | public enum ThreadContext
  class CallbackThreadAttribute (line 68) | [AttributeUsage(AttributeTargets.Method | AttributeTargets.Event)]

FILE: src/Jitter2/Collision/CollisionFilter/IBroadPhaseFilter.cs
  type IBroadPhaseFilter (line 17) | public interface IBroadPhaseFilter
    method Filter (line 25) | [CallbackThread(ThreadContext.Any)]

FILE: src/Jitter2/Collision/CollisionFilter/INarrowPhaseFilter.cs
  type INarrowPhaseFilter (line 20) | public interface INarrowPhaseFilter
    method Filter (line 32) | [CallbackThread(ThreadContext.Any)]

FILE: src/Jitter2/Collision/CollisionFilter/TriangleEdgeCollisionFilter.cs
  class TriangleEdgeCollisionFilter (line 21) | public class TriangleEdgeCollisionFilter : INarrowPhaseFilter
    method ProjectPointOnPlane (line 59) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Filter (line 73) | public bool Filter(RigidBodyShape shapeA, RigidBodyShape shapeB,

FILE: src/Jitter2/Collision/CollisionIsland.cs
  class Island (line 16) | public sealed class Island : IPartitionedSetIndex
    method Island (line 37) | public Island()
    method ClearLists (line 44) | internal void ClearLists()

FILE: src/Jitter2/Collision/DynamicTree/DynamicTree.FindNearest.cs
  class DynamicTree (line 14) | public partial class DynamicTree
    type FindNearestResult (line 19) | public struct FindNearestResult
    method FindNearestPoint (line 58) | public bool FindNearestPoint(in JVector position,
    method FindNearestPoint (line 68) | public bool FindNearestPoint(in JVector position, Real maxDistance,
    method FindNearestSphere (line 79) | public bool FindNearestSphere(Real radius, in JVector position,
    method FindNearestSphere (line 90) | public bool FindNearestSphere(Real radius, in JVector position, Real m...
    type DistanceQuery (line 96) | private struct DistanceQuery(in JBoundingBox box, in JQuaternion orien...
    method FindNearest (line 130) | public bool FindNearest<T>(in T support, in JQuaternion orientation, i...
    method FindNearest (line 158) | public bool FindNearest<T>(in T support, in JQuaternion orientation, i...
    method MinDistBox (line 184) | private static Real MinDistBox(in JBoundingBox queryBox, in TreeBox ta...
    method QueryDistance (line 196) | private bool QueryDistance<T>(in T support, in DistanceQuery query, ou...

FILE: src/Jitter2/Collision/DynamicTree/DynamicTree.RayCast.cs
  class DynamicTree (line 13) | public partial class DynamicTree
    type RayCastResult (line 18) | public struct RayCastResult
    type Ray (line 47) | private struct Ray(in JVector origin, in JVector direction)
    method RayCast (line 73) | public bool RayCast(JVector origin, JVector direction, RayCastFilterPr...
    method RayCast (line 90) | public bool RayCast(JVector origin, JVector direction, Real maxLambda,...
    method QueryRay (line 106) | private bool QueryRay(in Ray ray, out RayCastResult result)

FILE: src/Jitter2/Collision/DynamicTree/DynamicTree.SweepCast.cs
  class DynamicTree (line 14) | public partial class DynamicTree
    type SweepCastResult (line 19) | public struct SweepCastResult
    method SweepCastSphere (line 59) | public bool SweepCastSphere(Real radius, in JVector position, in JVect...
    method SweepCastSphere (line 70) | public bool SweepCastSphere(Real radius, in JVector position, in JVect...
    method SweepCastBox (line 81) | public bool SweepCastBox(in JVector halfExtents, in JQuaternion orient...
    method SweepCastBox (line 92) | public bool SweepCastBox(in JVector halfExtents, in JQuaternion orient...
    method SweepCastCapsule (line 104) | public bool SweepCastCapsule(Real radius, Real halfLength, in JQuatern...
    method SweepCastCapsule (line 116) | public bool SweepCastCapsule(Real radius, Real halfLength, in JQuatern...
    method SweepCastCylinder (line 128) | public bool SweepCastCylinder(Real radius, Real halfHeight, in JQuater...
    method SweepCastCylinder (line 140) | public bool SweepCastCylinder(Real radius, Real halfHeight, in JQuater...
    type SweepQuery (line 146) | private struct SweepQuery(in JBoundingBox box, in JQuaternion orientat...
    method SweepCast (line 178) | public bool SweepCast<T>(in T support, in JQuaternion orientation, in ...
    method SweepCast (line 206) | public bool SweepCast<T>(in T support, in JQuaternion orientation, in ...
    method SweepBox (line 229) | private static bool SweepBox(in JBoundingBox movingBox, in JVector tra...
    method QuerySweep (line 238) | private bool QuerySweep<T>(in T support, in SweepQuery sweep, out Swee...

FILE: src/Jitter2/Collision/DynamicTree/DynamicTree.cs
  class DynamicTree (line 24) | public partial class DynamicTree
    type OverlapEnumerationParam (line 26) | private struct OverlapEnumerationParam
    type Node (line 73) | public struct Node
    method DynamicTree (line 156) | public DynamicTree(Func<IDynamicTreeProxy, IDynamicTreeProxy, bool> fi...
    type Timings (line 171) | public enum Timings
    method EnumerateOverlapsCallback (line 211) | private void EnumerateOverlapsCallback(OverlapEnumerationParam parameter)
    method EnumerateOverlaps (line 238) | public void EnumerateOverlaps(Action<IDynamicTreeProxy, IDynamicTreePr...
    method Update (line 276) | public void Update(bool multiThread, Real dt)
    method UpdateBoundingBoxesCallback (line 358) | private void UpdateBoundingBoxesCallback(Parallel.Batch batch)
    method Update (line 372) | public void Update<T>(T proxy) where T : class, IDynamicTreeProxy
    method AddProxy (line 388) | public void AddProxy<T>(T proxy, bool active = true) where T : class, ...
    method IsActive (line 419) | public bool IsActive<T>(T proxy) where T : class, IDynamicTreeProxy
    method ActivateProxy (line 429) | public void ActivateProxy<T>(T proxy) where T : class, IDynamicTreeProxy
    method DeactivateProxy (line 442) | public void DeactivateProxy<T>(T proxy) where T : class, IDynamicTreeP...
    method RemoveProxy (line 452) | public void RemoveProxy(IDynamicTreeProxy proxy)
    method CalculateCost (line 470) | public double CalculateCost()
    method EnumerateTreeBoxes (line 479) | public void EnumerateTreeBoxes(Action<TreeBox, int> action)
    method EnumerateTreeBoxes (line 485) | private void EnumerateTreeBoxes(ref Node node, Action<TreeBox, int> ac...
    method PruneInvalidPairs (line 501) | private void PruneInvalidPairs()
    method Query (line 536) | public void Query<TSink>(ref TSink hits, in JVector rayOrigin, in JVec...
    method Query (line 582) | public void Query<TSink>(ref TSink hits, in JBoundingBox box)
    method Query (line 631) | public void Query<T>(T hits, in JVector rayOrigin, in JVector rayDirec...
    method Query (line 644) | public void Query<T>(T hits, in JBoundingBox box)
    method Optimize (line 659) | public void Optimize(int sweeps = 100, Real chance = (Real)0.01, bool ...
    method Optimize (line 666) | public void Optimize(Func<double> getNextRandom, int sweeps, Real chan...
    method AllocateNode (line 713) | private int AllocateNode()
    method FreeNode (line 730) | private void FreeNode(int node)
    method Cost (line 736) | private double Cost(ref Node node)
    method OverlapCheckAdd (line 746) | private void OverlapCheckAdd(int index, int node)
    method OverlapCheckRemove (line 767) | private void OverlapCheckRemove(int index, int node)
    method ScanForMovedProxies (line 788) | private void ScanForMovedProxies(Parallel.Batch batch)
    method ScanForOverlapsCallback (line 804) | private void ScanForOverlapsCallback(Parallel.Batch batch)
    method ExpandBoundingBox (line 812) | private static void ExpandBoundingBox(ref JBoundingBox box, in JVector...
    method InternalAddRemoveProxy (line 827) | private void InternalAddRemoveProxy(IDynamicTreeProxy proxy)
    method InternalAddProxy (line 852) | private void InternalAddProxy(IDynamicTreeProxy proxy)
    method InternalRemoveProxy (line 866) | private void InternalRemoveProxy(IDynamicTreeProxy proxy)
    method RemoveLeaf (line 873) | private int RemoveLeaf(int node)
    method FindBest (line 927) | [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.A...
    method FindBestGreedy (line 982) | [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.A...
    method FindBestHeuristic (line 1126) | [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.A...
    method InsertLeaf (line 1172) | private void InsertLeaf(int node, int where)

FILE: src/Jitter2/Collision/DynamicTree/IDynamicTreeProxy.cs
  type IDynamicTreeProxy (line 15) | public interface IDynamicTreeProxy : IPartitionedSetIndex
  type IUpdatableBoundingBox (line 39) | public interface IUpdatableBoundingBox
    method UpdateWorldBoundingBox (line 45) | public void UpdateWorldBoundingBox(Real dt = (Real)0.0);
  type IRayCastable (line 51) | public interface IRayCastable
    method RayCast (line 71) | public bool RayCast(in JVector origin, in JVector direction, out JVect...
  type IDistanceTestable (line 77) | public interface IDistanceTestable
    method Distance (line 98) | public bool Distance<T>(in T support, in JQuaternion orientation, in J...
  type ISweepTestable (line 106) | public interface ISweepTestable
    method Sweep (line 124) | public bool Sweep<T>(in T support, in JQuaternion orientation, in JVec...

FILE: src/Jitter2/Collision/DynamicTree/TreeBox.cs
  type TreeBox (line 26) | [StructLayout(LayoutKind.Explicit, Size = 8 * sizeof(Real))]
    method TreeBox (line 59) | public TreeBox(in JVector min, in JVector max)
    method TreeBox (line 70) | public TreeBox(in JBoundingBox box)
    method AsJBoundingBox (line 81) | public readonly JBoundingBox AsJBoundingBox() => new(Min, Max);
    method Contains (line 90) | public readonly bool Contains(in JVector point)
    method NotDisjoint (line 107) | [Obsolete($"Use !{nameof(Disjoint)} instead.")]
    method Disjoint (line 119) | public readonly bool Disjoint(in JBoundingBox box)
    method Contains (line 130) | public readonly bool Contains(in JBoundingBox box)
    method Encompasses (line 140) | [Obsolete($"Use {nameof(Contains)} instead.")]
    method Intersect1D (line 147) | private static bool Intersect1D(Real start, Real dir, Real min, Real max,
    method SegmentIntersect (line 173) | public readonly bool SegmentIntersect(in JVector origin, in JVector di...
    method RayIntersect (line 195) | public readonly bool RayIntersect(in JVector origin, in JVector direct...
    method RayIntersect (line 218) | public readonly bool RayIntersect(in JVector origin, in JVector direct...
    method ToString (line 235) | public readonly override string ToString()
    method Disjoint (line 247) | public readonly bool Disjoint(in TreeBox box) => TreeBox.Disjoint(this...
    method Contains (line 254) | public readonly bool Contains(in TreeBox box) => TreeBox.Contains(this...
    method GetSurfaceArea (line 260) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method MergedSurface (line 278) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Contains (line 298) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method NotDisjoint (line 314) | [Obsolete($"Use !{nameof(Disjoint)} instead.")]
    method Disjoint (line 331) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CreateMerged (line 349) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Equals (line 360) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Equals (line 369) | public readonly bool Equals(TreeBox other)
    method Equals (line 374) | public readonly override bool Equals(object? obj)
    method GetHashCode (line 379) | public readonly override int GetHashCode()

FILE: src/Jitter2/Collision/IslandHelper.cs
  class IslandHelper (line 23) | internal static class IslandHelper
    method GetFromPool (line 27) | private static Island GetFromPool()
    method ReturnToPool (line 40) | private static void ReturnToPool(Island island)
    method ArbiterCreated (line 45) | public static void ArbiterCreated(IslandSet islands, Arbiter arbiter)
    method ArbiterRemoved (line 56) | public static void ArbiterRemoved(IslandSet islands, Arbiter arbiter)
    method ConstraintCreated (line 64) | public static void ConstraintCreated(IslandSet islands, Constraint con...
    method ConstraintRemoved (line 72) | public static void ConstraintRemoved(IslandSet islands, Constraint con...
    method BodyAdded (line 80) | public static void BodyAdded(IslandSet islands, RigidBody body)
    method BodyRemoved (line 87) | public static void BodyRemoved(IslandSet islands, RigidBody body)
    method AddConnection (line 94) | public static void AddConnection(IslandSet islands, RigidBody body1, R...
    method RemoveConnection (line 113) | public static void RemoveConnection(IslandSet islands, RigidBody body1...
    method SplitIslands (line 140) | private static void SplitIslands(IslandSet islands, RigidBody body1, R...
    method MergeIslands (line 251) | private static void MergeIslands(IslandSet islands, RigidBody body1, R...

FILE: src/Jitter2/Collision/NarrowPhase/CollisionManifold.cs
  type CollisionManifold (line 22) | public unsafe struct CollisionManifold
    type ClipPoint (line 24) | private readonly struct ClipPoint
      method ClipPoint (line 29) | public ClipPoint(Real x, Real y)
      method LengthSquared (line 50) | public readonly Real LengthSquared()
    method PushLeft (line 86) | private void PushLeft(Span<JVector> left, in JVector v)
    method PushRight (line 103) | private void PushRight(Span<JVector> right, in JVector v)
    method Cross2D (line 120) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method StoreLinearIntersection (line 126) | private static void StoreLinearIntersection(in ClipPoint start, in Cli...
    method ProjectToPlane (line 138) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method LiftFromPlane (line 145) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method SignedArea (line 151) | private static Real SignedArea(ReadOnlySpan<ClipPoint> polygon, int co...
    method ReversePolygon (line 169) | private static void ReversePolygon(Span<ClipPoint> polygon, int count)
    method NormalizeWinding (line 177) | private static void NormalizeWinding(Span<ClipPoint> polygon, int count)
    method CalculateClipTolerance (line 185) | private static void CalculateClipTolerance(ReadOnlySpan<ClipPoint> lef...
    method CompactPolygon (line 207) | private static void CompactPolygon(Span<ClipPoint> polygon, ref int co...
    method SideOfEdge (line 264) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method IntersectSegmentsAgainstEdge (line 270) | private static ClipPoint IntersectSegmentsAgainstEdge(in ClipPoint edg...
    method ClipConvexPolygon (line 286) | private static int ClipConvexPolygon(Span<ClipPoint> subject, int subj...
    method ClipSegmentAgainstPolygon (line 348) | private static bool ClipSegmentAgainstPolygon(in ClipPoint segmentStar...
    method IntersectSegments (line 408) | private static bool IntersectSegments(in ClipPoint leftStart, in ClipP...
    method TryClipLinearIntersection (line 482) | private static bool TryClipLinearIntersection(ReadOnlySpan<ClipPoint> ...
    method SelectEvenlySpacedIndices (line 515) | private static int SelectEvenlySpacedIndices(int count, int targetCoun...
    method BuildManifold (line 546) | [SkipLocalsInit]
    method BuildManifold (line 670) | [MethodImpl(MethodImplOptions.AggressiveInlining)]

FILE: src/Jitter2/Collision/NarrowPhase/ConvexPolytope.cs
  type ConvexPolytope (line 31) | public unsafe struct ConvexPolytope
    type Triangle (line 33) | [StructLayout(LayoutKind.Sequential)]
    type Edge (line 48) | private readonly struct Edge(short a, short b)
      method Equals (line 53) | public static bool Equals(in Edge a, in Edge b)
    method GetVertex (line 79) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CalculatePoints (line 98) | public void CalculatePoints(in Triangle ctri, out JVector pA, out JVec...
    method CalcBarycentric (line 105) | private bool CalcBarycentric(in Triangle tri, out JVector result)
    method IsLit (line 199) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CreateTriangle (line 209) | private bool CreateTriangle(short a, short b, short c)
    method GetClosestTriangle (line 260) | public ref Triangle GetClosestTriangle()
    method InitTetrahedron (line 291) | public void InitTetrahedron()
    method InitTetrahedron (line 309) | public void InitTetrahedron(in JVector point)
    method InitHeap (line 334) | public void InitHeap()
    method AddVertex (line 349) | [SkipLocalsInit]

FILE: src/Jitter2/Collision/NarrowPhase/ISupportMappable.cs
  type ISupportMappable (line 19) | public interface ISupportMappable
    method SupportMap (line 26) | void SupportMap(in JVector direction, out JVector result);
    method GetCenter (line 32) | void GetCenter(out JVector point);

FILE: src/Jitter2/Collision/NarrowPhase/MinkowskiDifference.cs
  class MinkowskiDifference (line 19) | public static class MinkowskiDifference
    type Vertex (line 24) | public struct Vertex
      method Vertex (line 39) | public Vertex(JVector v)
    method Support (line 56) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method GetCenter (line 81) | [MethodImpl(MethodImplOptions.AggressiveInlining)]

FILE: src/Jitter2/Collision/NarrowPhase/NarrowPhase.cs
  class NarrowPhase (line 27) | public static class NarrowPhase
    type MprEpaSolver (line 31) | private struct MprEpaSolver
      method SolveMprEpa (line 35) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
      method SolveMpr (line 93) | [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions...
      method Collision (line 345) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method PointTest (line 430) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method PointTest (line 481) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method RayCast (line 504) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method RayCast (line 534) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Collision (line 625) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Collision (line 667) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Distance (line 708) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Distance (line 773) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Overlap (line 808) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Overlap (line 849) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method MprEpa (line 892) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method MprEpa (line 941) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Sweep (line 982) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Sweep (line 1091) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Sweep (line 1146) | [MethodImpl(MethodImplOptions.AggressiveInlining)]

FILE: src/Jitter2/Collision/NarrowPhase/SimplexSolver.cs
  type SimplexSolver (line 25) | [StructLayout(LayoutKind.Sequential)]
    method Reset (line 40) | public void Reset()
    method ClosestSegment (line 45) | private JVector ClosestSegment(int i0, int i1, out uint mask)
    method ClosestTriangle (line 78) | private JVector ClosestTriangle(int i0, int i1, int i2, out uint mask)
    method ClosestTetrahedron (line 148) | private JVector ClosestTetrahedron(out uint mask)
    method AddVertex (line 237) | [SkipLocalsInit]

FILE: src/Jitter2/Collision/NarrowPhase/SimplexSolverAB.cs
  type SimplexSolverAB (line 27) | [StructLayout(LayoutKind.Sequential)]
    type Barycentric (line 32) | private struct Barycentric
    method Reset (line 57) | public void Reset()
    method ClosestSegment (line 62) | private JVector ClosestSegment(int i0, int i1, ref Barycentric bc, out...
    method ClosestTriangle (line 98) | private JVector ClosestTriangle(int i0, int i1, int i2, ref Barycentri...
    method ClosestTetrahedron (line 176) | private JVector ClosestTetrahedron(ref Barycentric bc, out uint mask)
    method GetClosest (line 270) | public void GetClosest(out JVector pointA, out JVector pointB)
    method AddVertex (line 297) | [SkipLocalsInit]

FILE: src/Jitter2/Collision/NarrowPhase/SupportPrimitives.cs
  class SupportPrimitives (line 15) | public static class SupportPrimitives
    method CreatePoint (line 17) | public static Point CreatePoint() => default;
    method CreateSphere (line 19) | public static Sphere CreateSphere(Real radius) => new(radius);
    method CreateBox (line 21) | public static Box CreateBox(JVector halfExtents) => new(halfExtents);
    method CreateCapsule (line 23) | public static Capsule CreateCapsule(Real radius, Real halfLength) => n...
    method CreateCylinder (line 25) | public static Cylinder CreateCylinder(Real radius, Real halfHeight) =>...
    method CreateCone (line 27) | public static Cone CreateCone(Real radius, Real height) => new(radius,...
    type Point (line 32) | public readonly struct Point : ISupportMappable
      method SupportMap (line 34) | public readonly void SupportMap(in JVector direction, out JVector re...
      method GetCenter (line 36) | public readonly void GetCenter(out JVector point) => point = JVector...
    type Sphere (line 42) | public readonly struct Sphere(Real radius) : ISupportMappable
      method SupportMap (line 46) | public readonly void SupportMap(in JVector direction, out JVector re...
      method GetCenter (line 48) | public readonly void GetCenter(out JVector point) => point = JVector...
    type Box (line 54) | public readonly struct Box(JVector halfExtents) : ISupportMappable
      method SupportMap (line 62) | public readonly void SupportMap(in JVector direction, out JVector re...
      method GetCenter (line 69) | public readonly void GetCenter(out JVector point) => point = JVector...
    type Capsule (line 75) | public readonly struct Capsule(Real radius, Real halfLength) : ISuppor...
      method SupportMap (line 80) | public readonly void SupportMap(in JVector direction, out JVector re...
      method GetCenter (line 86) | public readonly void GetCenter(out JVector point) => point = JVector...
    type Cylinder (line 92) | public readonly struct Cylinder(Real radius, Real halfHeight) : ISuppo...
      method SupportMap (line 97) | public readonly void SupportMap(in JVector direction, out JVector re...
      method GetCenter (line 115) | public readonly void GetCenter(out JVector point) => point = JVector...
    type Cone (line 122) | public readonly struct Cone(Real radius, Real height) : ISupportMappable
      method SupportMap (line 127) | public readonly void SupportMap(in JVector direction, out JVector re...
      method GetCenter (line 145) | public readonly void GetCenter(out JVector point) => point = JVector...

FILE: src/Jitter2/Collision/PairHashSet.cs
  class PairHashSet (line 29) | internal unsafe class PairHashSet : IEnumerable<PairHashSet.Pair>
    type Pair (line 34) | [StructLayout(LayoutKind.Explicit, Size = 8)]
      method Pair (line 54) | public Pair(int id1, int id2)
      method GetHash (line 70) | public int GetHash()
    type Enumerator (line 79) | public struct Enumerator(PairHashSet hashSet) : IEnumerator<Pair>
      method Dispose (line 89) | public readonly void Dispose()
      method MoveNext (line 94) | public bool MoveNext()
      method Reset (line 107) | public void Reset()
    method PickSize (line 134) | private static int PickSize(int size = -1)
    method Clear (line 151) | public void Clear()
    method PairHashSet (line 160) | public PairHashSet()
    method Resize (line 165) | private void Resize(int size)
    method FindSlot (line 186) | private static int FindSlot(Pair[] slots, int hash, long id)
    method Contains (line 204) | public bool Contains(Pair pair)
    method Add (line 219) | public bool Add(Pair pair)
    method ConcurrentAdd (line 252) | public bool ConcurrentAdd(Pair pair)

FILE: src/Jitter2/Collision/Shapes/BoxShape.cs
  class BoxShape (line 15) | public class BoxShape : RigidBodyShape
    method BoxShape (line 26) | public BoxShape(JVector size)
    method BoxShape (line 63) | public BoxShape(Real size)
    method BoxShape (line 81) | public BoxShape(Real width, Real height, Real length)
    method SupportMap (line 91) | public override void SupportMap(in JVector direction, out JVector result)
    method LocalRayCast (line 98) | public override bool LocalRayCast(in JVector origin, in JVector direct...
    method GetCenter (line 181) | public override void GetCenter(out JVector point)
    method CalculateBoundingBox (line 186) | public override void CalculateBoundingBox(in JQuaternion orientation, ...
    method CalculateMassInertia (line 194) | public override void CalculateMassInertia(out JMatrix inertia, out JVe...

FILE: src/Jitter2/Collision/Shapes/CapsuleShape.cs
  class CapsuleShape (line 15) | public class CapsuleShape : RigidBodyShape
    method CapsuleShape (line 62) | public CapsuleShape(Real radius = (Real)0.5, Real length = (Real)1.0)
    method SupportMap (line 73) | public override void SupportMap(in JVector direction, out JVector result)
    method GetCenter (line 90) | public override void GetCenter(out JVector point)
    method CalculateBoundingBox (line 96) | public override void CalculateBoundingBox(in JQuaternion orientation, ...
    method CalculateMassInertia (line 111) | public override void CalculateMassInertia(out JMatrix inertia, out JVe...

FILE: src/Jitter2/Collision/Shapes/ConeShape.cs
  class ConeShape (line 15) | public class ConeShape : RigidBodyShape
    method ConeShape (line 62) | public ConeShape(Real radius = (Real)0.5, Real height = (Real)1.0)
    method SupportMap (line 73) | public override void SupportMap(in JVector direction, out JVector result)
    method GetCenter (line 96) | public override void GetCenter(out JVector point)
    method CalculateBoundingBox (line 102) | public override void CalculateBoundingBox(in JQuaternion orientation, ...
    method CalculateMassInertia (line 127) | public override void CalculateMassInertia(out JMatrix inertia, out JVe...

FILE: src/Jitter2/Collision/Shapes/ConvexHullShape.cs
  class ConvexHullShape (line 18) | public class ConvexHullShape : RigidBodyShape, ICloneableShape<ConvexHul...
    type CHullVector (line 20) | private struct CHullVector(in JVector vertex) : IEquatable<CHullVector>
      method Equals (line 26) | public readonly override bool Equals(object? obj)
      method GetHashCode (line 31) | public readonly override int GetHashCode()
      method Equals (line 36) | public readonly bool Equals(CHullVector other)
    type CHullTriangle (line 42) | private readonly struct CHullTriangle(ushort a, ushort b, ushort c)
    method ConvexHullShape (line 71) | public ConvexHullShape(ReadOnlySpan<JTriangle> triangles)
    method ConvexHullShape (line 154) | public ConvexHullShape(IEnumerable<JTriangle> triangles) :
    method ConvexHullShape (line 159) | private ConvexHullShape()
    method AddDistinct (line 167) | private static void AddDistinct(List<ushort> source, List<ushort> dest...
    method Clone (line 193) | public ConvexHullShape Clone()
    method UpdateShape (line 225) | public void UpdateShape()
    method CalculateMassInertia (line 232) | public override void CalculateMassInertia(out JMatrix inertia, out JVe...
    method CalculateMassInertia (line 242) | public void CalculateMassInertia()
    method CalculateBoundingBox (line 299) | public override void CalculateBoundingBox(in JQuaternion orientation, ...
    method CalcInitBox (line 316) | private void CalcInitBox()
    method InternalSupportMap (line 343) | private ushort InternalSupportMap(in JVector direction, out JVector re...
    method SupportMap (line 418) | public override void SupportMap(in JVector direction, out JVector result)
    method GetCenter (line 424) | public override void GetCenter(out JVector point)

FILE: src/Jitter2/Collision/Shapes/CylinderShape.cs
  class CylinderShape (line 15) | public class CylinderShape : RigidBodyShape
    method CylinderShape (line 63) | public CylinderShape(Real height, Real radius)
    method GetCenter (line 74) | public override void GetCenter(out JVector point)
    method SupportMap (line 80) | public override void SupportMap(in JVector direction, out JVector result)
    method CalculateBoundingBox (line 99) | public override void CalculateBoundingBox(in JQuaternion orientation, ...
    method CalculateMassInertia (line 121) | public override void CalculateMassInertia(out JMatrix inertia, out JVe...

FILE: src/Jitter2/Collision/Shapes/ICloneableShape.cs
  type ICloneableShape (line 15) | public interface ICloneableShape<out T> where T : Shape
    method Clone (line 24) | T Clone();

FILE: src/Jitter2/Collision/Shapes/PointCloudShape.cs
  class PointCloudShape (line 19) | public class PointCloudShape : RigidBodyShape, ICloneableShape<PointClou...
    method PointCloudShape (line 30) | public PointCloudShape(IEnumerable<JVector> vertices) :
    method PointCloudShape (line 42) | public PointCloudShape(ReadOnlySpan<JVector> vertices)
    method PointCloudShape (line 51) | public PointCloudShape(VertexSupportMap supportMap)
    method PointCloudShape (line 57) | private PointCloudShape()
    method Clone (line 65) | public PointCloudShape Clone()
    method UpdateShape (line 96) | public void UpdateShape()
    method CalculateMassInertia (line 105) | public void CalculateMassInertia()
    method CalculateMassInertia (line 111) | public override void CalculateMassInertia(out JMatrix inertia, out JVe...
    method CalculateBoundingBox (line 119) | public override void CalculateBoundingBox(in JQuaternion orientation, ...
    method CalcInitBox (line 136) | private void CalcInitBox()
    method SupportMap (line 164) | public override void SupportMap(in JVector direction, out JVector result)
    method GetCenter (line 171) | public override void GetCenter(out JVector point)

FILE: src/Jitter2/Collision/Shapes/RigidBodyShape.cs
  class RigidBodyShape (line 15) | public abstract class RigidBodyShape : Shape
    method UpdateWorldBoundingBox (line 24) | public sealed override void UpdateWorldBoundingBox(Real dt = (Real)0.0)
    method CalculateBoundingBox (line 41) | public virtual void CalculateBoundingBox(in JQuaternion orientation, i...
    method CalculateMassInertia (line 55) | [ReferenceFrame(ReferenceFrame.Local)]
    method LocalRayCast (line 81) | [ReferenceFrame(ReferenceFrame.Local)]
    method RayCast (line 87) | [ReferenceFrame(ReferenceFrame.World)]
    method Sweep (line 109) | [ReferenceFrame(ReferenceFrame.World)]
    method Distance (line 132) | [ReferenceFrame(ReferenceFrame.World)]

FILE: src/Jitter2/Collision/Shapes/Shape.cs
  class Shape (line 19) | public abstract class Shape : IDynamicTreeProxy, IUpdatableBoundingBox, ...
    method SweptExpandBoundingBox (line 37) | protected void SweptExpandBoundingBox(Real dt)
    method UpdateWorldBoundingBox (line 51) | [ReferenceFrame(ReferenceFrame.World)]
    method RayCast (line 54) | [ReferenceFrame(ReferenceFrame.World)]
    method Sweep (line 57) | [ReferenceFrame(ReferenceFrame.World)]
    method Distance (line 62) | [ReferenceFrame(ReferenceFrame.World)]
    method SupportMap (line 68) | [ReferenceFrame(ReferenceFrame.Local)]
    method GetCenter (line 72) | [ReferenceFrame(ReferenceFrame.Local)]

FILE: src/Jitter2/Collision/Shapes/ShapeHelper.cs
  class ShapeHelper (line 17) | public static class ShapeHelper
    method Tessellate (line 36) | public static void Tessellate<TSupport, TCollection>(in TSupport suppo...
    method Tessellate (line 56) | public static void Tessellate<TSupport, TSink>(in TSupport support, re...
    method Subdivide (line 74) | private static void Subdivide<TSupport, TSink>(in TSupport support, re...
    method Tessellate (line 118) | public static List<JTriangle> Tessellate<TSupport>(in TSupport support...
    method Tessellate (line 136) | public static List<JTriangle> Tessellate(ReadOnlySpan<JVector> vertice...
    method Tessellate (line 142) | public static List<JTriangle> Tessellate(IEnumerable<JVector> vertices...
    method MakeHull (line 149) | [Obsolete("Use Tessellate instead.")]
    method MakeHull (line 153) | [Obsolete("Use Tessellate instead.")]
    method MakeHull (line 157) | [Obsolete("Use Tessellate instead.")]
    method MakeHull (line 162) | [Obsolete("Use Tessellate instead.")]
    method CalculateBoundingBox (line 177) | public static void CalculateBoundingBox<TSupport>(in TSupport support,
    method SampleHull (line 224) | public static List<JVector> SampleHull(ReadOnlySpan<JVector> vertices,...
    method SampleHull (line 230) | public static List<JVector> SampleHull(IEnumerable<JVector> vertices, ...
    method SampleHull (line 256) | public static List<JVector> SampleHull<TSupport>(in TSupport support, ...
    method CalculateMassInertia (line 317) | public static void CalculateMassInertia<TSupport>(in TSupport support,...

FILE: src/Jitter2/Collision/Shapes/SphereShape.cs
  class SphereShape (line 15) | public class SphereShape : RigidBodyShape
    method SphereShape (line 43) | public SphereShape(Real radius = (Real)1.0)
    method SupportMap (line 51) | public override void SupportMap(in JVector direction, out JVector result)
    method GetCenter (line 57) | public override void GetCenter(out JVector point)
    method CalculateBoundingBox (line 62) | public override void CalculateBoundingBox(in JQuaternion orientation, ...
    method LocalRayCast (line 71) | public override bool LocalRayCast(in JVector origin, in JVector direct...
    method CalculateMassInertia (line 97) | public override void CalculateMassInertia(out JMatrix inertia, out JVe...

FILE: src/Jitter2/Collision/Shapes/TransformedShape.cs
  class TransformedShape (line 14) | public class TransformedShape : RigidBodyShape
    type TransformationType (line 16) | private enum TransformationType
    method TransformedShape (line 31) | public TransformedShape(RigidBodyShape shape, in JVector translation, ...
    method TransformedShape (line 44) | public TransformedShape(RigidBodyShape shape, JVector translation) :
    method TransformedShape (line 53) | public TransformedShape(RigidBodyShape shape, JMatrix transform) :
    method AnalyzeTransformation (line 76) | private void AnalyzeTransformation()
    method SupportMap (line 104) | public override void SupportMap(in JVector direction, out JVector result)
    method CalculateBoundingBox (line 121) | public override void CalculateBoundingBox(in JQuaternion orientation, ...
    method GetCenter (line 137) | public override void GetCenter(out JVector point)
    method CalculateMassInertia (line 144) | public override void CalculateMassInertia(out JMatrix inertia, out JVe...

FILE: src/Jitter2/Collision/Shapes/TriangleMesh.cs
  class TriangleMesh (line 19) | public class TriangleMesh
    class DegenerateTriangleException (line 21) | public sealed class DegenerateTriangleException(JTriangle triangle) :
    type Edge (line 24) | private readonly struct Edge(int indexA, int indexB) : IEquatable<Edge>
      method Equals (line 28) | public bool Equals(Edge other) => IndexA == other.IndexA && IndexB =...
      method Equals (line 29) | public override bool Equals(object? obj) => obj is Edge other && Equ...
      method GetHashCode (line 30) | public override int GetHashCode() => HashCode.Combine(IndexA, IndexB);
    type Triangle (line 33) | public struct Triangle(int a, int b, int c)
    method TriangleMesh (line 56) | public TriangleMesh(ReadOnlySpan<JTriangle> soup, bool ignoreDegenerat...
    method TriangleMesh (line 62) | public TriangleMesh(IEnumerable<JTriangle> soup, bool ignoreDegenerate...
    method TriangleMesh (line 76) | public TriangleMesh(ReadOnlySpan<JVector> vertices, ReadOnlySpan<int> ...
    method TriangleMesh (line 82) | public TriangleMesh(ReadOnlySpan<JVector> vertices, ReadOnlySpan<ushor...
    method TriangleMesh (line 92) | public TriangleMesh(ReadOnlySpan<JVector> vertices, ReadOnlySpan<uint>...
    method Create (line 103) | public static TriangleMesh Create<TVertex>(ReadOnlySpan<TVertex> verti...
    method Create (line 110) | public static TriangleMesh Create<TVertex>(ReadOnlySpan<TVertex> verti...
    method Create (line 117) | public static TriangleMesh Create<TVertex>(ReadOnlySpan<TVertex> verti...
    method CastVertices (line 124) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method BuildFromSoup (line 137) | private void BuildFromSoup(ReadOnlySpan<JTriangle> triangles, bool ign...
    method BuildFromIndexed (line 181) | private void BuildFromIndexed(ReadOnlySpan<JVector> vertices, ReadOnly...
    method AssignNeighbors (line 242) | private void AssignNeighbors()

FILE: src/Jitter2/Collision/Shapes/TriangleShape.cs
  class TriangleShape (line 16) | public class TriangleShape : RigidBodyShape
    method TriangleShape (line 39) | public TriangleShape(TriangleMesh mesh, int index)
    method CreateAllShapes (line 55) | public static IEnumerable<TriangleShape> CreateAllShapes(TriangleMesh ...
    method CalculateMassInertia (line 66) | public override void CalculateMassInertia(out JMatrix inertia, out JVe...
    method GetWorldVertices (line 79) | public void GetWorldVertices(out JVector a, out JVector b, out JVector c)
    method CalculateBoundingBox (line 101) | public override void CalculateBoundingBox(in JQuaternion orientation, ...
    method LocalRayCast (line 127) | public override bool LocalRayCast(in JVector origin, in JVector direct...
    method GetCenter (line 138) | public override void GetCenter(out JVector point)
    method SupportMap (line 150) | public override void SupportMap(in JVector direction, out JVector result)

FILE: src/Jitter2/Collision/Shapes/VertexSupportMap.cs
  type VertexSupportMap (line 18) | public struct VertexSupportMap : ISupportMappable, IEquatable<VertexSupp...
    method VertexSupportMap (line 23) | public VertexSupportMap(ReadOnlySpan<JVector> vertices)
    method VertexSupportMap (line 50) | public VertexSupportMap(IEnumerable<JVector> vertices) :
    method SupportMap (line 56) | public readonly void SupportMap(in JVector direction, out JVector result)
    method SupportMapAcceleratedForTests (line 62) | internal readonly void SupportMapAcceleratedForTests(in JVector direct...
    method SupportMapScalarForTests (line 65) | internal readonly void SupportMapScalarForTests(in JVector direction, ...
    method SupportMapAccelerated (line 68) | private readonly void SupportMapAccelerated(in JVector direction, out ...
    method SupportMapScalar (line 119) | private readonly void SupportMapScalar(in JVector direction, out JVect...
    method GetCenter (line 141) | public readonly void GetCenter(out JVector point) => point = center;
    method Equals (line 143) | public readonly bool Equals(VertexSupportMap other) => xvalues.Equals(...
    method Equals (line 147) | public readonly override bool Equals(object? obj) => obj is VertexSupp...
    method GetHashCode (line 149) | public readonly override int GetHashCode() => HashCode.Combine(xvalues...

FILE: src/Jitter2/DataStructures/ISink.cs
  type ISink (line 17) | public interface ISink<T>
    method Add (line 20) | void Add(in T item);
  type CollectionSink (line 27) | public readonly struct CollectionSink<T> : ISink<T>
    method CollectionSink (line 33) | public CollectionSink(ICollection<T> collection)
    method Add (line 39) | public void Add(in T item)

FILE: src/Jitter2/DataStructures/PartitionedSet.cs
  type IPartitionedSetIndex (line 18) | public interface IPartitionedSetIndex
  type ReadOnlyPartitionedSet (line 31) | public readonly struct ReadOnlyPartitionedSet<T>(PartitionedSet<T> parti...
    method Contains (line 59) | public bool Contains(T element) => partitionedSet.Contains(element);
    method IsActive (line 62) | public bool IsActive(T element) => partitionedSet.IsActive(element);
    method GetEnumerator (line 64) | public PartitionedSet<T>.Enumerator GetEnumerator()
    method GetEnumerator (line 69) | IEnumerator<T> IEnumerable<T>.GetEnumerator()
    method GetEnumerator (line 74) | IEnumerator IEnumerable.GetEnumerator()
  class PartitionedSet (line 88) | public class PartitionedSet<T> : IEnumerable<T> where T : class, IPartit...
    type Enumerator (line 90) | public struct Enumerator(PartitionedSet<T> partitionedSet) : IEnumerat...
      method Dispose (line 98) | public readonly void Dispose()
      method MoveNext (line 102) | public bool MoveNext()
      method Reset (line 113) | public void Reset()
    method PartitionedSet (line 128) | public PartitionedSet(int initialSize = 1024)
    method Clear (line 146) | public void Clear()
    method AsSpan (line 162) | public Span<T> AsSpan() => this.elements.AsSpan(0, Count);
    method Add (line 169) | public void Add(T element, bool active = false)
    method Swap (line 184) | private void Swap(int index0, int index1)
    method IsActive (line 198) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method MoveToActive (line 212) | public bool MoveToActive(T element)
    method MoveToInactive (line 228) | public bool MoveToInactive(T element)
    method Contains (line 244) | public bool Contains(T element)
    method Remove (line 254) | public void Remove(T element)
    method GetEnumerator (line 272) | public Enumerator GetEnumerator()
    method GetEnumerator (line 277) | IEnumerator<T> IEnumerable<T>.GetEnumerator()
    method GetEnumerator (line 282) | IEnumerator IEnumerable.GetEnumerator()

FILE: src/Jitter2/DataStructures/ReadOnlyHashset.cs
  type ReadOnlyHashSet (line 16) | public readonly struct ReadOnlyHashSet<T>(HashSet<T> hashset) : IReadOnl...
    method GetEnumerator (line 18) | public HashSet<T>.Enumerator GetEnumerator()
    method GetEnumerator (line 23) | IEnumerator<T> IEnumerable<T>.GetEnumerator()
    method GetEnumerator (line 28) | IEnumerator IEnumerable.GetEnumerator()
    method Contains (line 34) | public bool Contains(T item) => hashset.Contains(item);
    method CopyTo (line 37) | public void CopyTo(T[] array) => hashset.CopyTo(array);
    method CopyTo (line 40) | public void CopyTo(T[] array, int arrayIndex) => hashset.CopyTo(array,...

FILE: src/Jitter2/DataStructures/ReadOnlyList.cs
  type ReadOnlyList (line 16) | public readonly struct ReadOnlyList<T>(List<T> list) : IReadOnlyList<T>
    method GetEnumerator (line 21) | public List<T>.Enumerator GetEnumerator()
    method GetEnumerator (line 26) | IEnumerator<T> IEnumerable<T>.GetEnumerator()
    method GetEnumerator (line 31) | IEnumerator IEnumerable.GetEnumerator()

FILE: src/Jitter2/DataStructures/ShardedDictionary.cs
  class ShardedDictionary (line 34) | internal class ShardedDictionary<TKey, TValue> where TKey : notnull
    method ShardSuggestion (line 39) | private static int ShardSuggestion(int threads)
    method GetShardIndex (line 52) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method GetLock (line 73) | public Lock GetLock(TKey key)
    method ShardedDictionary (line 82) | public ShardedDictionary(int threads)
    method TryGetValue (line 102) | public bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue va...
    method Add (line 112) | public void Add(TKey key, TValue value)
    method Remove (line 121) | public void Remove(TKey key)

FILE: src/Jitter2/DataStructures/SlimBag.cs
  class SlimBag (line 29) | internal class SlimBag<T> : IEnumerable<T>
    type Enumerator (line 37) | public struct Enumerator : IEnumerator<T>
      method Enumerator (line 42) | internal Enumerator(SlimBag<T> owner)
      method MoveNext (line 51) | public bool MoveNext()
      method Dispose (line 58) | public void Dispose() { }
      method Reset (line 60) | public void Reset() => index = -1;
    method SlimBag (line 72) | public SlimBag(int initialSize = 4)
    method AsSpan (line 86) | public Span<T> AsSpan()
    method AddRange (line 95) | public void AddRange(IEnumerable<T> list)
    method Add (line 104) | public void Add(T item)
    method ConcurrentAdd (line 120) | public void ConcurrentAdd(T item)
    method Remove (line 152) | public void Remove(T item)
    method RemoveAt (line 171) | public void RemoveAt(int index)
    method Clear (line 200) | public void Clear()
    method TrackAndNullOutOne (line 214) | public void TrackAndNullOutOne()
    method GetEnumerator (line 221) | public Enumerator GetEnumerator() => new Enumerator(this);
    method GetEnumerator (line 223) | IEnumerator<T> IEnumerable<T>.GetEnumerator() => GetEnumerator();
    method GetEnumerator (line 224) | IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

FILE: src/Jitter2/DataStructures/SpanHelper.cs
  class SpanHelper (line 16) | internal static class SpanHelper
    method AsReadOnlySpan (line 31) | public static ReadOnlySpan<T> AsReadOnlySpan<T>(IEnumerable<T> element...

FILE: src/Jitter2/Dynamics/Arbiter.cs
  class Arbiter (line 32) | public sealed class Arbiter
  type ArbiterKey (line 65) | public readonly struct ArbiterKey(ulong key1, ulong key2) : IEquatable<A...
    method Equals (line 77) | public bool Equals(ArbiterKey other)
    method Equals (line 82) | public override bool Equals(object? obj)
    method GetHashCode (line 87) | public override int GetHashCode()

FILE: src/Jitter2/Dynamics/Constraints/AngularMotor.cs
  class AngularMotor (line 19) | public unsafe class AngularMotor : Constraint<AngularMotor.AngularMotorD...
    type AngularMotorData (line 21) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 46) | protected override void Create()
    method ResetWarmStart (line 53) | public override void ResetWarmStart() => Data.AccumulatedImpulse = (Re...
    method Initialize (line 64) | public void Initialize(JVector axis1, JVector axis2)
    method Initialize (line 85) | public void Initialize(JVector axis)
    method PrepareForIterationAngularMotor (line 127) | public static void PrepareForIterationAngularMotor(ref ConstraintData ...
    method IterateAngularMotor (line 147) | public static void IterateAngularMotor(ref ConstraintData constraint, ...
    method DebugDraw (line 173) | public override void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Dynamics/Constraints/BallSocket.cs
  class BallSocket (line 18) | public unsafe class BallSocket : Constraint<BallSocket.BallSocketData>
    type BallSocketData (line 20) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 48) | protected override void Create()
    method ResetWarmStart (line 55) | public override void ResetWarmStart() => Data.AccumulatedImpulse = JVe...
    method Initialize (line 65) | public void Initialize(JVector anchor)
    method PrepareForIterationBallSocket (line 130) | public static void PrepareForIterationBallSocket(ref ConstraintData co...
    method IterateBallSocket (line 199) | public static void IterateBallSocket(ref ConstraintData constraint, Re...
    method DebugDraw (line 224) | public override void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Dynamics/Constraints/ConeLimit.cs
  class ConeLimit (line 18) | public unsafe class ConeLimit : Constraint<ConeLimit.ConeLimitData>
    type ConeLimitData (line 20) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 51) | protected override void Create()
    method ResetWarmStart (line 58) | public override void ResetWarmStart() => Data.AccumulatedImpulse = (Re...
    method Initialize (line 71) | public void Initialize(JVector axisBody1, JVector axisBody2, AngularLi...
    method Initialize (line 108) | public void Initialize(JVector axis, AngularLimit limit)
    method PrepareForIterationConeLimit (line 216) | public static void PrepareForIterationConeLimit(ref ConstraintData con...
    method IterateConeLimit (line 296) | public static void IterateConeLimit(ref ConstraintData constraint, Rea...
    method DebugDraw (line 333) | public override void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Dynamics/Constraints/Constraint.cs
  type SmallConstraintData (line 28) | [StructLayout(LayoutKind.Sequential, Size = Precision.ConstraintSizeSmall)]
    method PrepareForIteration (line 45) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Iterate (line 52) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
  type ConstraintData (line 73) | [StructLayout(LayoutKind.Sequential, Size = Precision.ConstraintSizeFull)]
    method PrepareForIteration (line 90) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Iterate (line 97) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
  class ConstraintDispatchTable (line 105) | internal static unsafe class ConstraintDispatchTable
    type Entry (line 107) | internal readonly struct Entry(nint prepare, nint iterate)
    method Register (line 116) | public static uint Register(
    method Register (line 135) | public static uint Register(
    method Get (line 154) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
  class Constraint (line 172) | public abstract class Constraint<T> : Constraint where T : unmanaged
    method Create (line 183) | protected override void Create() => Constraint.CheckDataSize<T>();
    method CheckDataSize (line 240) | protected static unsafe void CheckDataSize<T>() where T : unmanaged
    method VerifyNotZero (line 255) | protected void VerifyNotZero()
    method Create (line 270) | protected virtual void Create()
    method ResetWarmStart (line 282) | public virtual void ResetWarmStart()
    method RegisterFullConstraint (line 288) | protected static unsafe uint RegisterFullConstraint(
    method RegisterSmallConstraint (line 295) | protected static unsafe uint RegisterSmallConstraint(
    method Create (line 324) | internal void Create(JHandle<SmallConstraintData> handle, RigidBody bo...
    method Create (line 330) | internal void Create(JHandle<ConstraintData> handle, RigidBody body1, ...
    method DebugDraw (line 349) | public virtual void DebugDraw(IDebugDrawer drawer)
  class Constraint (line 189) | public abstract class Constraint : IDebugDrawable
    method Create (line 183) | protected override void Create() => Constraint.CheckDataSize<T>();
    method CheckDataSize (line 240) | protected static unsafe void CheckDataSize<T>() where T : unmanaged
    method VerifyNotZero (line 255) | protected void VerifyNotZero()
    method Create (line 270) | protected virtual void Create()
    method ResetWarmStart (line 282) | public virtual void ResetWarmStart()
    method RegisterFullConstraint (line 288) | protected static unsafe uint RegisterFullConstraint(
    method RegisterSmallConstraint (line 295) | protected static unsafe uint RegisterSmallConstraint(
    method Create (line 324) | internal void Create(JHandle<SmallConstraintData> handle, RigidBody bo...
    method Create (line 330) | internal void Create(JHandle<ConstraintData> handle, RigidBody body1, ...
    method DebugDraw (line 349) | public virtual void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Dynamics/Constraints/DistanceLimit.cs
  class DistanceLimit (line 20) | public unsafe class DistanceLimit : Constraint<DistanceLimit.DistanceLim...
    type DistanceLimitData (line 22) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 55) | protected override void Create()
    method ResetWarmStart (line 62) | public override void ResetWarmStart() => Data.AccumulatedImpulse = (Re...
    method Initialize (line 69) | public void Initialize(JVector anchor1, JVector anchor2)
    method Initialize (line 84) | public void Initialize(JVector anchor1, JVector anchor2, LinearLimit l...
    method PrepareForIterationFixedAngle (line 189) | public static void PrepareForIterationFixedAngle(ref ConstraintData co...
    method IterateFixedAngle (line 280) | public static void IterateFixedAngle(ref ConstraintData constraint, Re...
    method DebugDraw (line 322) | public override void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Dynamics/Constraints/FixedAngle.cs
  class FixedAngle (line 17) | public unsafe class FixedAngle : Constraint<FixedAngle.FixedAngleData>
    type FixedAngleData (line 19) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 49) | protected override void Create()
    method ResetWarmStart (line 56) | public override void ResetWarmStart() => Data.AccumulatedImpulse = JVe...
    method Initialize (line 65) | public void Initialize()
    method PrepareForIterationFixedAngle (line 81) | public static void PrepareForIterationFixedAngle(ref ConstraintData co...
    method IterateFixedAngle (line 148) | public static void IterateFixedAngle(ref ConstraintData constraint, Re...
    method DebugDraw (line 164) | public override void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Dynamics/Constraints/HingeAngle.cs
  class HingeAngle (line 18) | public unsafe class HingeAngle : Constraint<HingeAngle.HingeAngleData>
    type HingeAngleData (line 20) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 54) | protected override void Create()
    method ResetWarmStart (line 61) | public override void ResetWarmStart() => Data.AccumulatedImpulse = JVe...
    method Initialize (line 73) | public void Initialize(JVector axis, AngularLimit limit)
    method PrepareForIterationHingeAngle (line 109) | public static void PrepareForIterationHingeAngle(ref ConstraintData co...
    method IterateHingeAngle (line 261) | public static void IterateHingeAngle(ref ConstraintData constraint, Re...
    method DebugDraw (line 300) | public override void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Dynamics/Constraints/Internal/QMatrix.cs
  type QMatrix (line 15) | internal unsafe struct QMatrix
    method Multiply (line 21) | private static QMatrix Multiply(Real* left, Real* right)
    method Projection (line 42) | public JMatrix Projection()
    method CreateLeftMatrix (line 51) | public static QMatrix CreateLeftMatrix(in JQuaternion quat)
    method CreateRightMatrix (line 76) | public static QMatrix CreateRightMatrix(in JQuaternion quat)
    method Multiply (line 101) | public static QMatrix Multiply(ref QMatrix left, ref QMatrix right)
    method ProjectMultiplyLeftRight (line 112) | public static JMatrix ProjectMultiplyLeftRight(in JQuaternion left, in...

FILE: src/Jitter2/Dynamics/Constraints/Limit.cs
  type AngularLimit (line 17) | public struct AngularLimit(JAngle from, JAngle to)
    method FromDegree (line 47) | public static AngularLimit FromDegree(Real min, Real max)
    method Deconstruct (line 57) | public readonly void Deconstruct(out JAngle limitMin, out JAngle limit...
  type LinearLimit (line 70) | public struct LinearLimit(Real from, Real to)
    method FromMinMax (line 100) | public static LinearLimit FromMinMax(Real min, Real max)
    method Deconstruct (line 110) | public readonly void Deconstruct(out Real limitMin, out Real limitMax)

FILE: src/Jitter2/Dynamics/Constraints/LinearMotor.cs
  class LinearMotor (line 19) | public unsafe class LinearMotor : Constraint<LinearMotor.LinearMotorData>
    type LinearMotorData (line 21) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 46) | protected override void Create()
    method ResetWarmStart (line 53) | public override void ResetWarmStart() => Data.AccumulatedImpulse = (Re...
    method Initialize (line 82) | public void Initialize(JVector axis1, JVector axis2)
    method PrepareForIterationLinearMotor (line 131) | public static void PrepareForIterationLinearMotor(ref ConstraintData c...
    method DebugDraw (line 149) | public override void DebugDraw(IDebugDrawer drawer)
    method IterateLinearMotor (line 163) | public static void IterateLinearMotor(ref ConstraintData constraint, R...

FILE: src/Jitter2/Dynamics/Constraints/PointOnLine.cs
  class PointOnLine (line 20) | public unsafe class PointOnLine : Constraint<PointOnLine.PointOnLineData>
    type PointOnLineData (line 22) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 57) | protected override void Create()
    method ResetWarmStart (line 64) | public override void ResetWarmStart() => Data.AccumulatedImpulse = JVe...
    method Initialize (line 67) | public void Initialize(JVector axis, JVector anchor1, JVector anchor2)
    method Initialize (line 84) | public void Initialize(JVector axis, JVector anchor1, JVector anchor2,...
    method PrepareForIterationPointOnLine (line 134) | [SkipLocalsInit]
    method IteratePointOnLine (line 300) | [SkipLocalsInit]
    method DebugDraw (line 379) | public override void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Dynamics/Constraints/PointOnPlane.cs
  class PointOnPlane (line 20) | public unsafe class PointOnPlane : Constraint<PointOnPlane.SliderData>
    type SliderData (line 22) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 55) | protected override void Create()
    method ResetWarmStart (line 62) | public override void ResetWarmStart() => Data.AccumulatedImpulse = (Re...
    method Initialize (line 65) | public void Initialize(JVector axis, JVector anchor1, JVector anchor2)
    method Initialize (line 81) | public void Initialize(JVector axis, JVector anchor1, JVector anchor2,...
    method PrepareForIterationPointOnPlane (line 104) | public static void PrepareForIterationPointOnPlane(ref ConstraintData ...
    method IteratePointOnPlane (line 196) | public static void IteratePointOnPlane(ref ConstraintData constraint, ...
    method DebugDraw (line 235) | public override void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Dynamics/Constraints/TwistAngle.cs
  class TwistAngle (line 18) | public unsafe class TwistAngle : Constraint<TwistAngle.TwistLimitData>
    type TwistLimitData (line 20) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 50) | protected override void Create()
    method ResetWarmStart (line 57) | public override void ResetWarmStart() => Data.AccumulatedImpulse = (Re...
    method Initialize (line 69) | public void Initialize(JVector axis1, JVector axis2, AngularLimit limit)
    method Initialize (line 124) | public void Initialize(JVector axis1, JVector axis2)
    method PrepareForIterationTwistAngle (line 129) | public static void PrepareForIterationTwistAngle(ref ConstraintData co...
    method DebugDraw (line 235) | public override void DebugDraw(IDebugDrawer drawer)
    method IterateTwistAngle (line 248) | public static void IterateTwistAngle(ref ConstraintData constraint, Re...

FILE: src/Jitter2/Dynamics/Contact.cs
  type ContactData (line 31) | [StructLayout(LayoutKind.Sequential)]
    type SolveMode (line 37) | [Flags]
    method PrepareForIteration (line 123) | public unsafe void PrepareForIteration(Real idt)
    method Iterate (line 147) | public unsafe void Iterate(bool applyBias)
    method PrepareForIterationAccelerated (line 167) | internal unsafe void PrepareForIterationAccelerated(Real idt)
    method PrepareForIterationScalar (line 177) | internal unsafe void PrepareForIterationScalar(Real idt)
    method IterateAccelerated (line 187) | internal unsafe void IterateAccelerated(bool applyBias)
    method IterateScalar (line 197) | internal unsafe void IterateScalar(bool applyBias)
    method UpdatePosition (line 216) | public unsafe void UpdatePosition()
    method Init (line 249) | public void Init(RigidBody body1, RigidBody body2)
    method ResetMode (line 268) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method AddContact (line 306) | public unsafe void AddContact(in JVector point1, in JVector point2, in...
    method CalcArea4Points (line 393) | private static Real CalcArea4Points(in JVector p0, in JVector p1, in J...
    method SortCachedPoints (line 409) | private void SortCachedPoints(in JVector point1, in JVector point2, in...
    type Contact (line 478) | [StructLayout(LayoutKind.Explicit)]
      type Flags (line 493) | [Flags]
      method Initialize (line 575) | [MethodImpl(MethodImplOptions.AggressiveOptimization)]
      method UpdatePosition (line 626) | [MethodImpl(MethodImplOptions.AggressiveOptimization)]
      method PrepareForIteration (line 666) | public unsafe void PrepareForIteration(ContactData* cd, Real idt)
      method Iterate (line 776) | public unsafe void Iterate(ContactData* cd, bool applyBias)
      method GetSum3 (line 869) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
      method TransformSymmetricInertia (line 875) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
      method PrepareForIterationAccelerated (line 885) | [MethodImpl(MethodImplOptions.AggressiveOptimization)]
      method IterateAccelerated (line 1014) | [MethodImpl(MethodImplOptions.AggressiveOptimization)]

FILE: src/Jitter2/Dynamics/Joints/HingeJoint.cs
  class HingeJoint (line 15) | public class HingeJoint : Joint
    method HingeJoint (line 24) | public HingeJoint(World world, RigidBody body1, RigidBody body2, JVect...
    method HingeJoint (line 48) | public HingeJoint(World world, RigidBody body1, RigidBody body2, JVect...

FILE: src/Jitter2/Dynamics/Joints/Joint.cs
  class Joint (line 15) | public class Joint : IDebugDrawable
    method Register (line 23) | protected void Register(Constraint constraint) => constraints.Add(cons...
    method Deregister (line 28) | protected void Deregister(Constraint constraint) => constraints.Remove...
    method Enable (line 33) | public void Enable()
    method Disable (line 46) | public void Disable()
    method Remove (line 58) | public void Remove()
    method DebugDraw (line 69) | public virtual void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Dynamics/Joints/PrismaticJoint.cs
  class PrismaticJoint (line 15) | public class PrismaticJoint : Joint
    method PrismaticJoint (line 26) | public PrismaticJoint(World world, RigidBody body1, RigidBody body2, J...
    method PrismaticJoint (line 32) | public PrismaticJoint(World world, RigidBody body1, RigidBody body2, J...

FILE: src/Jitter2/Dynamics/Joints/UniversalJoint.cs
  class UniversalJoint (line 15) | public class UniversalJoint : Joint
    method UniversalJoint (line 24) | public UniversalJoint(World world, RigidBody body1, RigidBody body2, J...

FILE: src/Jitter2/Dynamics/Joints/WeldJoint.cs
  class WeldJoint (line 17) | public class WeldJoint : Joint
    method WeldJoint (line 25) | public WeldJoint(World world, RigidBody body1, RigidBody body2, JVecto...

FILE: src/Jitter2/Dynamics/RigidBody.cs
  type MassInertiaUpdateMode (line 24) | public enum MassInertiaUpdateMode
  type MotionType (line 40) | public enum MotionType
  type RigidBodyData (line 72) | [StructLayout(LayoutKind.Explicit, Size = Precision.RigidBodyDataSize)]
  class RigidBody (line 200) | public sealed class RigidBody : IPartitionedSetIndex, IDebugDrawable
    method RaiseBeginCollide (line 276) | internal void RaiseBeginCollide(Arbiter arbiter)
    method RaiseEndCollide (line 281) | internal void RaiseEndCollide(Arbiter arbiter)
    method ClearContactCache (line 305) | public void ClearContactCache()
    method RigidBody (line 379) | internal RigidBody(JHandle<RigidBodyData> handle, World world)
    method SetDefaultMassInertia (line 456) | private void SetDefaultMassInertia()
    method Move (line 508) | private void Move()
    method Update (line 521) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method UpdateWorldInertia (line 651) | private void UpdateWorldInertia()
    method SetActivationState (line 753) | public void SetActivationState(bool active)
    method AttachToShape (line 759) | private void AttachToShape(RigidBodyShape shape)
    method ShouldUpdateMassInertia (line 771) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method AddShapes (line 788) | public void AddShapes(IEnumerable<RigidBodyShape> shapes)
    method AddShapes (line 804) | public void AddShapes(IEnumerable<RigidBodyShape> shapes, MassInertiaU...
    method AddShape (line 853) | public void AddShape(RigidBodyShape shape)
    method AddShape (line 866) | public void AddShape(RigidBodyShape shape, MassInertiaUpdateMode massI...
    method AddShape (line 881) | [Obsolete($"Use {nameof(AddShapes)} with {nameof(MassInertiaUpdateMode...
    method AddShape (line 885) | [Obsolete($"Use {nameof(AddShape)} with {nameof(MassInertiaUpdateMode)...
    method AddForce (line 913) | public void AddForce(in JVector force, bool wakeup = true)
    method AddForce (line 934) | [ReferenceFrame(ReferenceFrame.World)]
    method ApplyImpulse (line 959) | public void ApplyImpulse(in JVector impulse, bool wakeup = true)
    method ApplyImpulse (line 979) | [ReferenceFrame(ReferenceFrame.World)]
    method AddImpulse (line 995) | [Obsolete("Use ApplyImpulse instead.")]
    method AddImpulse (line 998) | [Obsolete("Use ApplyImpulse instead.")]
    method PredictPosition (line 1007) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method PredictOrientation (line 1016) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method PredictPose (line 1027) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method RemoveShape (line 1041) | public void RemoveShape(RigidBodyShape shape)
    method RemoveShape (line 1054) | public void RemoveShape(RigidBodyShape shape, MassInertiaUpdateMode ma...
    method RemoveShapes (line 1084) | public void RemoveShapes(IEnumerable<RigidBodyShape> shapes)
    method RemoveShapes (line 1095) | public void RemoveShapes(IEnumerable<RigidBodyShape> shapes, MassInert...
    method RemoveShape (line 1140) | [Obsolete($"Use {nameof(RemoveShape)} with {nameof(MassInertiaUpdateMo...
    method RemoveShape (line 1144) | [Obsolete($"Use {nameof(RemoveShapes)} with {nameof(MassInertiaUpdateM...
    method ClearShapes (line 1151) | public void ClearShapes()
    method ClearShapes (line 1160) | public void ClearShapes(MassInertiaUpdateMode massInertiaMode)
    method ClearShapes (line 1165) | [Obsolete($"Use {nameof(ClearShapes)} with {nameof(MassInertiaUpdateMo...
    method SetMassInertia (line 1181) | public void SetMassInertia()
    method SetMassInertia (line 1225) | public void SetMassInertia(Real mass)
    method SetMassInertia (line 1263) | public void SetMassInertia(in JMatrix inertia, Real mass, bool setAsIn...
    method DebugDraw (line 1305) | public void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/IDebugDrawer.cs
  type IDebugDrawable (line 14) | public interface IDebugDrawable
    method DebugDraw (line 20) | public void DebugDraw(IDebugDrawer drawer);
  type IDebugDrawer (line 26) | public interface IDebugDrawer
    method DrawSegment (line 33) | public void DrawSegment(in JVector pA, in JVector pB);
    method DrawTriangle (line 41) | public void DrawTriangle(in JVector pA, in JVector pB, in JVector pC);
    method DrawPoint (line 47) | public void DrawPoint(in JVector p);

FILE: src/Jitter2/LinearMath/Interop.cs
  class UnsafeInterop (line 18) | internal static class UnsafeInterop
    method ThrowSizeMismatch (line 20) | [MethodImpl(MethodImplOptions.NoInlining)]
    method ThrowSizeMismatch (line 26) | [MethodImpl(MethodImplOptions.NoInlining)]
  type JVector (line 32) | public partial struct JVector
    method UnsafeAs (line 42) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method UnsafeFrom (line 62) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
  type JQuaternion (line 80) | public partial struct JQuaternion
    method UnsafeAs (line 91) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method UnsafeFrom (line 112) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
  class UnsafeBase64Serializer (line 132) | public static class UnsafeBase64Serializer<T> where T : unmanaged
    method Serialize (line 134) | public static string Serialize(in T value)
    method Deserialize (line 150) | public static T Deserialize(string base64)

FILE: src/Jitter2/LinearMath/JAngle.cs
  type JAngle (line 16) | [StructLayout(LayoutKind.Explicit, Size = 1*sizeof(Real))]
    method ToString (line 28) | public readonly override string ToString()
    method Equals (line 33) | public readonly override bool Equals(object? obj)
    method Equals (line 38) | public readonly bool Equals(JAngle p)
    method GetHashCode (line 43) | public readonly override int GetHashCode()
    method FromRadian (line 60) | public static JAngle FromRadian(Real rad)
    method FromDegree (line 68) | public static JAngle FromDegree(Real deg)

FILE: src/Jitter2/LinearMath/JBoundingBox.cs
  type JBoundingBox (line 16) | [StructLayout(LayoutKind.Explicit, Size = 6 * sizeof(Real))]
    type ContainmentType (line 24) | public enum ContainmentType
    method JBoundingBox (line 64) | static JBoundingBox()
    method ToString (line 75) | public readonly override string ToString()
    method Transform (line 81) | [Obsolete($"Use static {nameof(CreateTransformed)} instead.")]
    method CreateTransformed (line 105) | public static JBoundingBox CreateTransformed(in JBoundingBox box, in J...
    method Intersect1D (line 122) | private static bool Intersect1D(Real start, Real dir, Real min, Real max,
    method SegmentIntersect (line 148) | public readonly bool SegmentIntersect(in JVector origin, in JVector di...
    method RayIntersect (line 170) | public readonly bool RayIntersect(in JVector origin, in JVector direct...
    method RayIntersect (line 193) | public readonly bool RayIntersect(in JVector origin, in JVector direct...
    method Contains (line 213) | public readonly bool Contains(in JVector point)
    method GetCorners (line 224) | public readonly void GetCorners(Span<JVector> destination)
    method AddPoint (line 237) | [Obsolete($"Use static {nameof(AddPointInPlace)} instead.")]
    method AddPointInPlace (line 249) | public static void AddPointInPlace(ref JBoundingBox box, in JVector po...
    method CreateFromPoints (line 260) | public static JBoundingBox CreateFromPoints(IEnumerable<JVector> points)
    method Contains (line 283) | public readonly ContainmentType Contains(in JBoundingBox box)
    method NotDisjoint (line 302) | [Obsolete($"Use !{nameof(Disjoint)} instead.")]
    method Disjoint (line 315) | public static bool Disjoint(in JBoundingBox left, in JBoundingBox right)
    method Contains (line 327) | public static bool Contains(in JBoundingBox outer, in JBoundingBox inner)
    method Encompasses (line 337) | [Obsolete($"Use {nameof(Contains)} instead.")]
    method CreateMerged (line 350) | public static JBoundingBox CreateMerged(in JBoundingBox original, in J...
    method CreateMerged (line 362) | public static void CreateMerged(in JBoundingBox original, in JBounding...
    method GetVolume (line 376) | public readonly Real GetVolume()
    method GetSurfaceArea (line 385) | public readonly Real GetSurfaceArea()
    method Equals (line 391) | public readonly bool Equals(JBoundingBox other)
    method Equals (line 396) | public readonly override bool Equals(object? obj)
    method GetHashCode (line 401) | public readonly override int GetHashCode() => HashCode.Combine(Min, Max);

FILE: src/Jitter2/LinearMath/JMatrix.cs
  type JMatrix (line 16) | [StructLayout(LayoutKind.Explicit, Size = 9 * sizeof(Real))]
    method JMatrix (line 42) | static JMatrix()
    method FromColumns (line 60) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method UnsafeGet (line 74) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method GetColumn (line 85) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Multiply (line 101) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method MultiplyTransposed (line 114) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method TransposedMultiply (line 127) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CreateRotationMatrix (line 140) | public static JMatrix CreateRotationMatrix(JVector axis, Real angle)
    method Multiply (line 155) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Add (line 185) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method MultiplyTransposed (line 198) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CreateRotationX (line 227) | public static JMatrix CreateRotationX(Real radians)
    method CreateRotationY (line 249) | public static JMatrix CreateRotationY(Real radians)
    method CreateRotationZ (line 271) | public static JMatrix CreateRotationZ(Real radians)
    method CreateScale (line 293) | public static JMatrix CreateScale(in JVector scale)
    method CreateScale (line 311) | public static JMatrix CreateScale(Real x, Real y, Real z)
    method TransposedMultiply (line 322) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Add (line 352) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Subtract (line 372) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Determinant (line 390) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Inverse (line 403) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Multiply (line 445) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Multiply (line 458) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CreateFromQuaternion (line 478) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Absolute (line 490) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CreateFromQuaternion (line 509) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Transpose (line 533) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CreateCrossProduct (line 553) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Transpose (line 559) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Trace (line 596) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Equals (line 642) | public readonly bool Equals(JMatrix other)
    method ToString (line 651) | public readonly override string ToString()
    method Equals (line 658) | public readonly override bool Equals(object? obj)
    method GetHashCode (line 663) | public readonly override int GetHashCode()

FILE: src/Jitter2/LinearMath/JQuaternion.cs
  type JQuaternion (line 18) | [StructLayout(LayoutKind.Explicit, Size = 4 * sizeof(Real))]
    method JQuaternion (line 54) | public JQuaternion(Real w, in JVector v) : this(v.X, v.Y, v.Z, w)
    method Add (line 64) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CreateFromToRotation (line 84) | public static JQuaternion CreateFromToRotation(JVector from, JVector to)
    method Add (line 109) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Conjugate (line 127) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Conjugate (line 145) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ToString (line 159) | public readonly override string ToString()
    method Subtract (line 170) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Subtract (line 183) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Multiply (line 201) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method GetBasisX (line 216) | public readonly JVector GetBasisX()
    method GetBasisY (line 233) | public readonly JVector GetBasisY()
    method GetBasisZ (line 250) | public readonly JVector GetBasisZ()
    method CreateRotationX (line 264) | public static JQuaternion CreateRotationX(Real radians)
    method CreateRotationY (line 276) | public static JQuaternion CreateRotationY(Real radians)
    method CreateRotationZ (line 288) | public static JQuaternion CreateRotationZ(Real radians)
    method CreateFromAxisAngle (line 304) | public static JQuaternion CreateFromAxisAngle(in JVector axis, Real an...
    method ToAxisAngle (line 321) | public static void ToAxisAngle(JQuaternion quaternion, out JVector axi...
    method Multiply (line 352) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ConjugateMultiply (line 377) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ConjugateMultiply (line 397) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method MultiplyConjugate (line 410) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method MultiplyConjugate (line 430) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Multiply (line 443) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Multiply (line 456) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Length (line 469) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method LengthSquared (line 479) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Normalize (line 488) | [Obsolete($"In-place Normalize() is deprecated; " +
    method NormalizeInPlace (line 505) | public static void NormalizeInPlace(ref JQuaternion quaternion)
    method Normalize (line 520) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Normalize (line 532) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CreateFromMatrix (line 544) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CreateFromMatrix (line 556) | public static void CreateFromMatrix(in JMatrix matrix, out JQuaternion...
    method Dot (line 600) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Inverse (line 616) | public static JQuaternion Inverse(in JQuaternion value)
    method Lerp (line 636) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Slerp (line 669) | public static JQuaternion Slerp(in JQuaternion quaternion1, in JQuater...
    method Equals (line 765) | public readonly bool Equals(JQuaternion other)
    method Equals (line 770) | public readonly override bool Equals(object? obj)
    method GetHashCode (line 775) | public readonly override int GetHashCode() => HashCode.Combine(X, Y, Z...

FILE: src/Jitter2/LinearMath/JTriangle.cs
  type JTriangle (line 16) | [StructLayout(LayoutKind.Explicit, Size = 9*sizeof(Real))]
    type CullMode (line 23) | public enum CullMode
    method RayIntersect (line 62) | public readonly bool RayIntersect(in JVector origin, in JVector direct...
    method ToString (line 116) | public readonly override string ToString()
    method GetNormal (line 126) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method GetCenter (line 135) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method GetArea (line 144) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method GetBoundingBox (line 153) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ClosestPoint (line 168) | public readonly JVector ClosestPoint(JVector point)
    method GetHashCode (line 226) | public readonly override int GetHashCode() => HashCode.Combine(V0, V1,...
    method Equals (line 228) | public readonly bool Equals(JTriangle other)
    method Equals (line 233) | public readonly override bool Equals(object? obj)

FILE: src/Jitter2/LinearMath/JVector.cs
  type JVector (line 16) | [StructLayout(LayoutKind.Explicit, Size = 3 * sizeof(Real))]
    method JVector (line 47) | static JVector()
    method Set (line 60) | [Obsolete($"Do not use any longer.")]
    method JVector (line 72) | public JVector(Real xyz) : this(xyz, xyz, xyz)
    method UnsafeGet (line 76) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ToString (line 104) | public readonly override string ToString()
    method Equals (line 109) | public readonly override bool Equals(object? obj)
    method Min (line 135) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Min (line 148) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Max (line 162) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Max (line 175) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Abs (line 188) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method MaxAbs (line 199) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Transform (line 212) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Transform (line 225) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method TransposedTransform (line 238) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ConjugatedTransform (line 251) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Transform (line 264) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method TransposedTransform (line 282) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Transform (line 300) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ConjugatedTransform (line 322) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Outer (line 347) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Dot (line 369) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Add (line 381) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Add (line 394) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Subtract (line 408) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Subtract (line 421) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Cross (line 439) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Cross (line 452) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method GetHashCode (line 464) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Negate (line 467) | [Obsolete($"Use static {nameof(NegateInPlace)} instead.")]
    method NegateInPlace (line 480) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Negate (line 493) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Negate (line 505) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Normalize (line 522) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method NormalizeSafe (line 535) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Normalize (line 544) | [Obsolete($"In-place Normalize() is deprecated; " +
    method NormalizeInPlace (line 560) | public static void NormalizeInPlace(ref JVector toNormalize)
    method Normalize (line 574) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method LengthSquared (line 587) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Length (line 596) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Swap (line 605) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Multiply (line 617) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Multiply (line 630) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Equals (line 731) | public readonly bool Equals(JVector other)

FILE: src/Jitter2/LinearMath/MathHelper.cs
  class MathHelper (line 16) | public static class MathHelper
    method SignBit (line 27) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method SignBit (line 34) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method RotationQuaternion (line 47) | public static JQuaternion RotationQuaternion(in JVector omega, Real dt)
    method IsRotationMatrix (line 86) | public static bool IsRotationMatrix(in JMatrix matrix, Real epsilon = ...
    method IsZero (line 104) | public static bool IsZero(in JVector vector, Real epsilon = (Real)1e-6)
    method IsZero (line 117) | public static bool IsZero(Real value, Real epsilon = (Real)1e-6)
    method UnsafeIsZero (line 128) | public static bool UnsafeIsZero(ref JMatrix matrix, Real epsilon = (Re...
    method InverseSquareRoot (line 142) | public static JMatrix InverseSquareRoot(JMatrix m, int sweeps = 2)
    method CreateOrthonormal (line 201) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CheckOrthonormalBasis (line 260) | public static bool CheckOrthonormalBasis(in JMatrix matrix, Real epsil...
    method CloseToZero (line 272) | public static bool CloseToZero(in JVector v, Real epsilonSq = (Real)1e...

FILE: src/Jitter2/LinearMath/StableMath.cs
  class StableMath (line 19) | internal static class StableMath
    method FloorToInt (line 29) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ReduceAngle (line 38) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ReduceToQuadrant (line 55) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method SinPolynomial (line 68) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method CosPolynomial (line 89) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ApplyQuadrant (line 108) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ApplyQuadrantSin (line 121) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ApplyQuadrantCos (line 133) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method SinCos (line 145) | internal static (Real sin, Real cos) SinCos(Real angle)
    method Sin (line 161) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Cos (line 182) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method AtanTaylor (line 201) | private static Real AtanTaylor(Real value)
    method Atan (line 218) | private static Real Atan(Real value)
    method AsinTaylor (line 239) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Atan2 (line 256) | internal static Real Atan2(Real y, Real x)
    method Acos (line 277) | internal static Real Acos(Real value)
    method Asin (line 298) | internal static Real Asin(Real value)

FILE: src/Jitter2/Logger.cs
  class Logger (line 14) | public static class Logger
    type LogLevel (line 24) | public enum LogLevel
    method Information (line 35) | public static void Information(scoped ReadOnlySpan<char> format) => Lo...
    method Information (line 38) | public static void Information<T1>(scoped ReadOnlySpan<char> format, T...
    method Information (line 41) | public static void Information<T1, T2>(scoped ReadOnlySpan<char> forma...
    method Information (line 44) | public static void Information<T1, T2, T3>(scoped ReadOnlySpan<char> f...
    method Warning (line 50) | public static void Warning(scoped ReadOnlySpan<char> format) => Log(Lo...
    method Warning (line 53) | public static void Warning<T1>(scoped ReadOnlySpan<char> format, T1 ar...
    method Warning (line 56) | public static void Warning<T1, T2>(scoped ReadOnlySpan<char> format, T...
    method Warning (line 59) | public static void Warning<T1, T2, T3>(scoped ReadOnlySpan<char> forma...
    method Error (line 65) | public static void Error(scoped ReadOnlySpan<char> format) => Log(LogL...
    method Error (line 68) | public static void Error<T1>(scoped ReadOnlySpan<char> format, T1 arg1...
    method Error (line 71) | public static void Error<T1, T2>(scoped ReadOnlySpan<char> format, T1 ...
    method Error (line 74) | public static void Error<T1, T2, T3>(scoped ReadOnlySpan<char> format,...
    method Log (line 81) | private static void Log(LogLevel level, scoped ReadOnlySpan<char> format)
    method LogFormat (line 89) | private static void LogFormat<T1>(LogLevel level, scoped ReadOnlySpan<...
    method LogFormat (line 97) | private static void LogFormat<T1, T2>(LogLevel level, scoped ReadOnlyS...
    method LogFormat (line 105) | private static void LogFormat<T1, T2, T3>(LogLevel level, scoped ReadO...

FILE: src/Jitter2/Parallelization/Parallel.cs
  class Parallel (line 18) | public static class Parallel
    type Batch (line 24) | public readonly struct Batch(int start, int end)
      method ToString (line 27) | public override string ToString()
    method GetBounds (line 51) | public static void GetBounds(int numElements, int numDivisions, int pa...
    method ForBatch (line 76) | public static void ForBatch(int lower, int upper, int numTasks, Action...

FILE: src/Jitter2/Parallelization/ParallelExtensions.cs
  class ParallelExtensions (line 20) | public static class ParallelExtensions
    method ParallelForBatch (line 30) | public static int ParallelForBatch(this Array array, int taskThreshold,
    method ParallelForBatch (line 50) | public static int ParallelForBatch<T>(this PartitionedBuffer<T> list, ...
    method ParallelForBatch (line 70) | public static int ParallelForBatch<T>(this ReadOnlyPartitionedSet<T> l...
    method ParallelForBatch (line 90) | internal static int ParallelForBatch<T>(this PartitionedSet<T> partiti...
    method ParallelForBatch (line 110) | internal static int ParallelForBatch<T>(this SlimBag<T> list, int task...

FILE: src/Jitter2/Parallelization/ReaderWriterLock.cs
  type ReaderWriterLock (line 23) | public struct ReaderWriterLock
    method EnterReadLock (line 35) | public void EnterReadLock()
    method EnterWriteLock (line 54) | public void EnterWriteLock()
    method ExitReadLock (line 73) | public void ExitReadLock()
    method ExitWriteLock (line 81) | public void ExitWriteLock()

FILE: src/Jitter2/Parallelization/ThreadPool.cs
  class ThreadPool (line 87) | public sealed class ThreadPool
    type ITask (line 89) | private interface ITask
      method Perform (line 91) | public void Perform();
    class Task (line 94) | private sealed class Task<T> : ITask
      method Perform (line 99) | public void Perform()
      method GetFree (line 113) | public static Task<T> GetFree()
    method ThreadPool (line 151) | private ThreadPool()
    method ChangeThreadCount (line 188) | public void ChangeThreadCount(int numThreads)
    method AddTask (line 239) | public void AddTask<T>(Action<T> action, T parameter)
    method ResumeWorkers (line 272) | public void ResumeWorkers()
    method PauseWorkers (line 284) | public void PauseWorkers()
    method ThreadProc (line 289) | private void ThreadProc(int index)
    method Execute (line 337) | public void Execute()

FILE: src/Jitter2/Precision.cs
  class Precision (line 37) | public static class Precision

FILE: src/Jitter2/SoftBodies/BroadPhaseCollisionFilter.cs
  class BroadPhaseCollisionFilter (line 19) | public class BroadPhaseCollisionFilter : IBroadPhaseFilter
    method BroadPhaseCollisionFilter (line 27) | public BroadPhaseCollisionFilter(World world)
    method Filter (line 33) | public bool Filter(IDynamicTreeProxy proxyA, IDynamicTreeProxy proxyB)

FILE: src/Jitter2/SoftBodies/DynamicTreeCollisionFilter.cs
  class DynamicTreeCollisionFilter (line 16) | public static class DynamicTreeCollisionFilter
    method Filter (line 26) | public static bool Filter(IDynamicTreeProxy proxyA, IDynamicTreeProxy ...

FILE: src/Jitter2/SoftBodies/SoftBody.cs
  class SoftBody (line 17) | public class SoftBody
    method SoftBody (line 49) | public SoftBody(World world)
    method AddShape (line 59) | public void AddShape(SoftBodyShape shape)
    method AddSpring (line 69) | public void AddSpring(Constraint constraint)
    method Destroy (line 77) | public virtual void Destroy()
    method WorldOnPostStep (line 106) | protected virtual void WorldOnPostStep(Real dt)

FILE: src/Jitter2/SoftBodies/SoftBodyShape.cs
  class SoftBodyShape (line 17) | public abstract class SoftBodyShape : Shape
    method GetClosest (line 24) | public abstract RigidBody GetClosest(in JVector pos);
    method RayCast (line 32) | public override bool RayCast(in JVector origin, in JVector direction, ...
    method Sweep (line 38) | public override bool Sweep<T>(in T support, in JQuaternion orientation...
    method Distance (line 50) | public override bool Distance<T>(in T support, in JQuaternion orientat...

FILE: src/Jitter2/SoftBodies/SoftBodyTetrahedron.cs
  class SoftBodyTetrahedron (line 15) | public sealed class SoftBodyTetrahedron : SoftBodyShape
    method SoftBodyTetrahedron (line 25) | public SoftBodyTetrahedron(SoftBody body, RigidBody v1, RigidBody v2, ...
    method GetClosest (line 61) | public override RigidBody GetClosest(in JVector pos)
    method SupportMap (line 80) | public override void SupportMap(in JVector direction, out JVector result)
    method GetCenter (line 99) | public override void GetCenter(out JVector point)
    method UpdateWorldBoundingBox (line 106) | public override void UpdateWorldBoundingBox(Real dt = (Real)0.0)

FILE: src/Jitter2/SoftBodies/SoftBodyTriangle.cs
  class SoftBodyTriangle (line 15) | public sealed class SoftBodyTriangle : SoftBodyShape
    method SoftBodyTriangle (line 54) | public SoftBodyTriangle(SoftBody body, RigidBody v1, RigidBody v2, Rig...
    method GetClosest (line 68) | public override RigidBody GetClosest(in JVector pos)
    method UpdateWorldBoundingBox (line 79) | public override void UpdateWorldBoundingBox(Real dt = (Real)0.0)
    method SupportMap (line 98) | public override void SupportMap(in JVector direction, out JVector result)
    method GetCenter (line 126) | public override void GetCenter(out JVector point)

FILE: src/Jitter2/SoftBodies/SpringConstraint.cs
  class SpringConstraint (line 28) | public unsafe class SpringConstraint : Constraint<SpringConstraint.Sprin...
    type SpringData (line 33) | [StructLayout(LayoutKind.Sequential)]
    method Create (line 61) | protected override void Create()
    method ResetWarmStart (line 68) | public override void ResetWarmStart() => Data.AccumulatedImpulse = (Re...
    method Initialize (line 80) | public void Initialize(JVector anchor1, JVector anchor2)
    method SetSpringParameters (line 102) | public void SetSpringParameters(Real frequency, Real damping, Real dt)
    method PrepareForIterationSpringConstraint (line 210) | public static void PrepareForIterationSpringConstraint(ref ConstraintD...
    method IterateSpringConstraint (line 270) | public static void IterateSpringConstraint(ref ConstraintData constrai...
    method DebugDraw (line 291) | public override void DebugDraw(IDebugDrawer drawer)

FILE: src/Jitter2/Tracer.cs
  type TraceCategory (line 33) | internal enum TraceCategory : ushort
  type TraceName (line 41) | internal enum TraceName : long
  type TracePhase (line 65) | internal enum TracePhase : byte
  class Tracer (line 82) | public static class Tracer
    method Tracer (line 86) | static Tracer()
    type TraceEvent (line 97) | private struct TraceEvent
    class PerThreadBuffer (line 107) | private sealed class PerThreadBuffer(int initialCapacity)
    method EnsureThreadBuffer (line 118) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Record (line 130) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Grow (line 144) | private static void Grow(PerThreadBuffer b)
    method NowMicroseconds (line 156) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileBegin (line 162) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileBegin (line 176) | internal static void ProfileBegin(Delegate @delegate)
    method ProfileEnd (line 189) | internal static void ProfileEnd(Delegate @delegate)
    method ProfileEnd (line 202) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileEvent (line 216) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileScopeBegin (line 238) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileScopeEnd (line 247) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    class GcNotification (line 269) | private sealed class GcNotification
    method StartGcTracing (line 290) | private static void StartGcTracing()
    method WriteToFile (line 307) | public static void WriteToFile(string filename = DefaultPath, bool cle...
    method PhaseToChar (line 389) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileBegin (line 404) | [Conditional("_NEVER")]
    method ProfileEnd (line 409) | [Conditional("_NEVER")]
    method ProfileEvent (line 414) | [Conditional("_NEVER")]
    method ProfileScopeBegin (line 419) | [Conditional("_NEVER")]
    method ProfileBegin (line 424) | [Conditional("_NEVER")]
    method ProfileEnd (line 429) | [Conditional("_NEVER")]
    method ProfileScopeEnd (line 434) | [Conditional("_NEVER")]
  class Tracer (line 402) | internal static class Tracer
    method Tracer (line 86) | static Tracer()
    type TraceEvent (line 97) | private struct TraceEvent
    class PerThreadBuffer (line 107) | private sealed class PerThreadBuffer(int initialCapacity)
    method EnsureThreadBuffer (line 118) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Record (line 130) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method Grow (line 144) | private static void Grow(PerThreadBuffer b)
    method NowMicroseconds (line 156) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileBegin (line 162) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileBegin (line 176) | internal static void ProfileBegin(Delegate @delegate)
    method ProfileEnd (line 189) | internal static void ProfileEnd(Delegate @delegate)
    method ProfileEnd (line 202) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileEvent (line 216) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileScopeBegin (line 238) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileScopeEnd (line 247) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    class GcNotification (line 269) | private sealed class GcNotification
    method StartGcTracing (line 290) | private static void StartGcTracing()
    method WriteToFile (line 307) | public static void WriteToFile(string filename = DefaultPath, bool cle...
    method PhaseToChar (line 389) | [MethodImpl(MethodImplOptions.AggressiveInlining)]
    method ProfileBegin (line 404) | [Conditional("_NEVER")]
    method ProfileEnd (line 409) | [Conditional("_NEVER")]
    method ProfileEvent (line 414) | [Conditional("_NEVER")]
    method ProfileScopeBegin (line 419) | [Conditional("_NEVER")]
    method ProfileBegin (line 424) | [Conditional("_NEVER")]
    method ProfileEnd (line 429) | [Conditional("_NEVER")]
    method ProfileScopeEnd (line 434) | [Conditional("_NEVER")]

FILE: src/Jitter2/Unmanaged/MemoryHelper.cs
  class MemoryHelper (line 26) | public static unsafe class MemoryHelper
    type IsolatedInt (line 36) | [StructLayout(LayoutKind.Explicit, Size = 132)]
    type MemBlock6Real (line 55) | [StructLayout(LayoutKind.Sequential, Size = 6 * sizeof(Real))]
    type MemBlock9Real (line 64) | [StructLayout(LayoutKind.Sequential, Size = 9 * sizeof(Real))]
    type MemBlock12Real (line 73) | [StructLayout(LayoutKind.Sequential, Size = 12 * sizeof(Real))]
    type MemBlock16Real (line 82) | [StructLayout(LayoutKind.Sequential, Size = 16 * sizeof(Real))]
    method AllocateHeap (line 95) | public static T* AllocateHeap<T>(int num) where T : unmanaged
    method AlignedAllocateHeap (line 111) | public static T* AlignedAllocateHeap<T>(int num, int alignment) where ...
    method Free (line 121) | public static void Free<T>(T* ptr) where T : unmanaged
    method AllocateHeap (line 135) | public static void* AllocateHeap(int len) => NativeMemory.Alloc((nuint...
    method AlignedAllocateHeap (line 147) | public static void* AlignedAllocateHeap(int len, int alignment) => Nat...
    method Free (line 153) | public static void Free(void* ptr) => NativeMemory.Free(ptr);
    method AlignedFree (line 159) | public static void AlignedFree(void* ptr) => NativeMemory.AlignedFree(...
    method MemSet (line 166) | public static void MemSet(void* buffer, int len)  => Unsafe.InitBlock(...

FILE: src/Jitter2/Unm
Condensed preview — 383 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (6,916K chars).
[
  {
    "path": ".github/ISSUE_TEMPLATE/issue.md",
    "chars": 300,
    "preview": "---\nname: Issue\nabout: Generic Jitter Issue\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Note:** For general inquiries, su"
  },
  {
    "path": ".github/workflows/build-demo.yml",
    "chars": 493,
    "preview": "name: Build Demo\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n\njobs:\n  build-demo:\n\n    runs-on: ubuntu-latest\n\n "
  },
  {
    "path": ".github/workflows/deploy-docs.yml",
    "chars": 924,
    "preview": "name: Build and deploy documentation\n\non:\n  push:\n    branches:\n      - main\n\njobs:\n  deploy:\n    name: Build and deploy"
  },
  {
    "path": ".github/workflows/deterministic-hash.yml",
    "chars": 1318,
    "preview": "name: Deterministic Hash\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n\njobs:\n  deterministic-hash:\n    name: Dete"
  },
  {
    "path": ".github/workflows/jitter-tests.yml",
    "chars": 1723,
    "preview": "name: JitterTests\n\non:\n  push:\n    branches: [ main ]\n  pull_request:\n\npermissions:\n  id-token: write\n  contents: write\n"
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 4175,
    "preview": "# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json\n\nname: Publish NuGet\non:\n  workflow_di"
  },
  {
    "path": ".github/workflows/test-deploy-docs.yml",
    "chars": 546,
    "preview": "name: Build documentation\n\non:\n  pull_request:\n    branches:\n      - main\n\njobs:\n  test-deploy:\n    name: Build document"
  },
  {
    "path": "LICENSE",
    "chars": 1086,
    "preview": "MIT License\n\nCopyright (c) Thorben Linneweber and contributors\n\nPermission is hereby granted, free of charge, to any per"
  },
  {
    "path": "README.md",
    "chars": 4322,
    "preview": "#  <img src=\"./media/logo/jitterstringsmallsmall.png\" alt=\"screenshot\" width=\"240\"/> Jitter Physics 2\n\n[![GitHub Actions"
  },
  {
    "path": "docfx/.gitignore",
    "chars": 12,
    "preview": "_site/\napi/\n"
  },
  {
    "path": "docfx/AppBundle/WebDemo.runtimeconfig.json",
    "chars": 2420,
    "preview": "{\n  \"runtimeOptions\": {\n    \"tfm\": \"net9.0\",\n    \"includedFrameworks\": [\n      {\n        \"name\": \"Microsoft.NETCore.App\""
  },
  {
    "path": "docfx/AppBundle/_framework/blazor.boot.json",
    "chars": 1988,
    "preview": "{\n  \"mainAssemblyName\": \"WebDemo.dll\",\n  \"resources\": {\n    \"hash\": \"sha256-hTaBZwg08pO2ImtLM7JTW8Jw7NOSyjigcWbUoIrnt6U="
  },
  {
    "path": "docfx/AppBundle/_framework/dotnet.js",
    "chars": 40677,
    "preview": "//! Licensed to the .NET Foundation under one or more agreements.\n//! The .NET Foundation licenses this file to you unde"
  },
  {
    "path": "docfx/AppBundle/_framework/dotnet.native.js",
    "chars": 239145,
    "preview": "\nvar createDotnetRuntime = (() => {\n  var _scriptDir = import.meta.url;\n  \n  return (\nasync function(moduleArg = {}) {\n\n"
  },
  {
    "path": "docfx/AppBundle/_framework/dotnet.runtime.js",
    "chars": 194767,
    "preview": "//! Licensed to the .NET Foundation under one or more agreements.\n//! The .NET Foundation licenses this file to you unde"
  },
  {
    "path": "docfx/AppBundle/_framework/supportFiles/0_JetBrainsMono-LICENSE.txt",
    "chars": 4399,
    "preview": "Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)\n\nThis Font Software is li"
  },
  {
    "path": "docfx/AppBundle/_framework/supportFiles/2_lighting.fs",
    "chars": 1911,
    "preview": "#version 100\n\nprecision mediump float;\n\n// Input vertex attributes (from vertex shader)\nvarying vec3 fragPosition;\nvaryi"
  },
  {
    "path": "docfx/AppBundle/_framework/supportFiles/3_lighting.vs",
    "chars": 1578,
    "preview": "#version 100\n\n// Input vertex attributes\nattribute vec3 vertexPosition;\nattribute vec2 vertexTexCoord;\nattribute vec3 ve"
  },
  {
    "path": "docfx/AppBundle/index.html",
    "chars": 3505,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <title>Jitter2 WebDemo</title>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewpor"
  },
  {
    "path": "docfx/AppBundle/main.js",
    "chars": 3086,
    "preview": "import { dotnet } from './_framework/dotnet.js';\n\nasync function initialize() {\n    const canvas = document.getElementBy"
  },
  {
    "path": "docfx/AppBundle/package.json",
    "chars": 19,
    "preview": "{ \"type\":\"module\" }"
  },
  {
    "path": "docfx/docfx.json",
    "chars": 1111,
    "preview": "{\n  \"$schema\": \"https://raw.githubusercontent.com/dotnet/docfx/main/schemas/docfx.schema.json\",\n  \"metadata\": [\n    {\n  "
  },
  {
    "path": "docfx/docs/changelog.md",
    "chars": 15340,
    "preview": "# Changelog\n\n### Jitter 2.8.4 (2026-04-19)\n\n- Improved `CollisionManifold` generation by performing full clipping, produ"
  },
  {
    "path": "docfx/docs/documentation/arbiters.md",
    "chars": 6115,
    "preview": "# Arbiters\n\nArbiters manage contact information between two rigid bodies.\nAn arbiter is created when two shapes begin ov"
  },
  {
    "path": "docfx/docs/documentation/bodies.md",
    "chars": 7055,
    "preview": "# Rigid Bodies\n\nRigid bodies are the main entity of the dynamics system.\n\n## Creating a body\n\nRigid bodies are associate"
  },
  {
    "path": "docfx/docs/documentation/constraints.md",
    "chars": 4854,
    "preview": "# Constraints\n\nConstraints restrict degrees of freedom of rigid bodies.\nIn Jitter2, constraints always act between two b"
  },
  {
    "path": "docfx/docs/documentation/dynamictree.md",
    "chars": 10879,
    "preview": "# Dynamic Tree\n\nThe dynamic tree holds instances which implement the `IDynamicTreeProxy` interface.\nIts main task is to "
  },
  {
    "path": "docfx/docs/documentation/filters.md",
    "chars": 3672,
    "preview": "# Collision Filters\n\nThere are three types of collision filters: `world.DynamicTree.Filter`, `world.BroadPhaseFilter`, a"
  },
  {
    "path": "docfx/docs/documentation/general.md",
    "chars": 8209,
    "preview": "# General\n\nThis section covers fundamental design decisions and configuration options.\n\n## Collision Detection Philosoph"
  },
  {
    "path": "docfx/docs/documentation/shapes.md",
    "chars": 5622,
    "preview": "# Shapes\n\nShapes define how the rigid body collides with other objects.\nShapes implement the `ISupportMappable` interfac"
  },
  {
    "path": "docfx/docs/documentation/world.md",
    "chars": 10579,
    "preview": "# Jitter World\n\nThe `World` class contains all entities in the physics simulation and provides the `World.Step` method t"
  },
  {
    "path": "docfx/docs/introduction.md",
    "chars": 11597,
    "preview": "---\n_disableBreadcrumb: true\n_disableContribution: true\n---\n\n<div class=\"jp-hero\">\n  <p class=\"jp-hero-eyebrow\">Fast &mi"
  },
  {
    "path": "docfx/docs/toc.yml",
    "chars": 1297,
    "preview": "- name: Welcome\n  href: introduction.md\n- name: Quickstart\n  expanded: true\n  items:\n    - name: Boxes\n      expanded: t"
  },
  {
    "path": "docfx/docs/tutorials/boxes/hello-world.md",
    "chars": 3274,
    "preview": "# Hello World\n\nWe will now add physics to the scene. We do this by creating a new instance of the World class and adding"
  },
  {
    "path": "docfx/docs/tutorials/boxes/project-setup.md",
    "chars": 827,
    "preview": "# Project Setup\n\nIn this project we will use Raylib and Jitter to implement a simple scene of boxes falling to the groun"
  },
  {
    "path": "docfx/docs/tutorials/boxes/render-loop.md",
    "chars": 1684,
    "preview": "# Render Loop\n\nThe first thing we need to do is to familiarize ourselves a bit with Raylib_cs. Replace the content of `P"
  },
  {
    "path": "docfx/docs/tutorials/teapots/aftermath.md",
    "chars": 1482,
    "preview": "# Aftermath\n\n### `PointCloudShape` vs `ConvexHullShape`\n\nIn this example, we used the `PointCloudShape` to simulate a ri"
  },
  {
    "path": "docfx/docs/tutorials/teapots/hello-world.md",
    "chars": 6054,
    "preview": "# Hello World\n\n### Creating the `PointCloudShape`\n\nWe can now create a `PointCloudShape` from the sampled vertices:\n\n```"
  },
  {
    "path": "docfx/docs/tutorials/teapots/hull-sampling.md",
    "chars": 3274,
    "preview": "# Hull Sampling\n\nThe teapot is a concave shape, which we will approximate using its convex hull ([Wikipedia](https://en."
  },
  {
    "path": "docfx/docs/tutorials/teapots/project-setup.md",
    "chars": 1898,
    "preview": "# Project Setup\n\nIn the previous section, we created a simulation of falling boxes. Jitter includes several default shap"
  },
  {
    "path": "docfx/index.md",
    "chars": 63,
    "preview": "---\n_layout: redirect\nredirect_url: docs/introduction.html\n---\n"
  },
  {
    "path": "docfx/run.sh",
    "chars": 57,
    "preview": "#!/bin/bash\ndocfx metadata\ndocfx build\ndocfx serve _site\n"
  },
  {
    "path": "docfx/template/public/main.js",
    "chars": 267,
    "preview": "export default {\n  iconLinks: [\n    {\n      icon: 'github',\n      href: 'https://github.com/notgiven688/jitterphysics2',"
  },
  {
    "path": "docfx/toc.yml",
    "chars": 72,
    "preview": "- name: Docs\n  href: ./docs/\n- name: API (single precision)\n  href: api/"
  },
  {
    "path": "other/ContactClipping/ClipDebug.cs",
    "chars": 23971,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Numerics;\n\nnamespace JitterClipVisualizer;\n\ninternal readon"
  },
  {
    "path": "other/ContactClipping/JitterClipVisualizer.csproj",
    "chars": 332,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <OutputType>Exe</OutputType>\n    <TargetFramework>net10.0</Targ"
  },
  {
    "path": "other/ContactClipping/Program.cs",
    "chars": 14162,
    "preview": "using System;\nusing System.Numerics;\nusing Raylib_cs;\n\nnamespace JitterClipVisualizer;\n\ninternal static class Program\n{\n"
  },
  {
    "path": "other/GodotDemo/.gitattributes",
    "chars": 80,
    "preview": "# Normalize EOL for all files that Git considers text files.\n* text=auto eol=lf\n"
  },
  {
    "path": "other/GodotDemo/.gitignore",
    "chars": 42,
    "preview": "# Godot 4+ specific ignores\n.godot/\n.idea\n"
  },
  {
    "path": "other/GodotDemo/JitterGodot.csproj",
    "chars": 272,
    "preview": "<Project Sdk=\"Godot.NET.Sdk/4.3.0\">\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <EnableDynamicLo"
  },
  {
    "path": "other/GodotDemo/JitterGodot.sln",
    "chars": 1055,
    "preview": "Microsoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 2012\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C0"
  },
  {
    "path": "other/GodotDemo/Program.cs",
    "chars": 2829,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Godot;\nusing Jitter2;\nusing Jitter2.Collision.S"
  },
  {
    "path": "other/GodotDemo/README.md",
    "chars": 265,
    "preview": "## Jitter2 in Godot\n\nSmall demo to get started with Jitter2 in Godot.\n\nGet Godot (.NET, Version >= 4.3) from https://god"
  },
  {
    "path": "other/GodotDemo/assets/box.png.import",
    "chars": 798,
    "preview": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://bmwn361sv2cuo\"\npath.s3tc=\"res://.godot/imported/box.pn"
  },
  {
    "path": "other/GodotDemo/assets/floor.png.import",
    "chars": 804,
    "preview": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://bmalqw2x4nhkw\"\npath.s3tc=\"res://.godot/imported/floor."
  },
  {
    "path": "other/GodotDemo/icon.svg.import",
    "chars": 843,
    "preview": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://bj3qla3sx2dm8\"\npath=\"res://.godot/imported/icon.svg-21"
  },
  {
    "path": "other/GodotDemo/main_scene.tscn",
    "chars": 2143,
    "preview": "[gd_scene load_steps=10 format=3 uid=\"uid://coyqv4677vx2l\"]\n\n[ext_resource type=\"Texture2D\" uid=\"uid://bmalqw2x4nhkw\" pa"
  },
  {
    "path": "other/GodotDemo/project.godot",
    "chars": 636,
    "preview": "; Engine configuration file.\n; It's best edited using the editor UI and not directly,\n; since the parameters that go her"
  },
  {
    "path": "other/GodotSoftBodies/.gitattributes",
    "chars": 80,
    "preview": "# Normalize EOL for all files that Git considers text files.\n* text=auto eol=lf\n"
  },
  {
    "path": "other/GodotSoftBodies/.gitignore",
    "chars": 42,
    "preview": "# Godot 4+ specific ignores\n.godot/\n.idea\n"
  },
  {
    "path": "other/GodotSoftBodies/JitterGodot.csproj",
    "chars": 272,
    "preview": "<Project Sdk=\"Godot.NET.Sdk/4.3.0\">\n  <PropertyGroup>\n    <TargetFramework>net8.0</TargetFramework>\n    <EnableDynamicLo"
  },
  {
    "path": "other/GodotSoftBodies/JitterGodot.sln",
    "chars": 1055,
    "preview": "Microsoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 2012\nProject(\"{FAE04EC0-301F-11D3-BF4B-00C0"
  },
  {
    "path": "other/GodotSoftBodies/Program.cs",
    "chars": 13800,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing Godot;\nusing Jitter2;\nusing Jitter2.Collision.S"
  },
  {
    "path": "other/GodotSoftBodies/README.md",
    "chars": 189,
    "preview": "## Jitter2 Soft Bodies in Godot\n\nSmall demo to showing Jitter2 soft bodies in Godot.\n\nGet Godot (.NET, Version >= 4.3) f"
  },
  {
    "path": "other/GodotSoftBodies/assets/texture_08.png.import",
    "chars": 819,
    "preview": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://couisnncdt24n\"\npath.s3tc=\"res://.godot/imported/textur"
  },
  {
    "path": "other/GodotSoftBodies/icon.svg.import",
    "chars": 843,
    "preview": "[remap]\n\nimporter=\"texture\"\ntype=\"CompressedTexture2D\"\nuid=\"uid://bj3qla3sx2dm8\"\npath=\"res://.godot/imported/icon.svg-21"
  },
  {
    "path": "other/GodotSoftBodies/main_scene.tscn",
    "chars": 1941,
    "preview": "[gd_scene load_steps=9 format=3 uid=\"uid://coyqv4677vx2l\"]\n\n[ext_resource type=\"Script\" path=\"res://Program.cs\" id=\"1_q0"
  },
  {
    "path": "other/GodotSoftBodies/project.godot",
    "chars": 650,
    "preview": "; Engine configuration file.\n; It's best edited using the editor UI and not directly,\n; since the parameters that go her"
  },
  {
    "path": "other/WebDemo/LICENSE",
    "chars": 2265,
    "preview": "The WebDemo uses the outstanding code from\n\nhttps://github.com/disketteman/DotnetRaylibWasm\nand\nhttps://github.com/Kiril"
  },
  {
    "path": "other/WebDemo/Program.cs",
    "chars": 30541,
    "preview": "using System;\nusing System.Collections.Generic;\nusing System.Numerics;\nusing Raylib_cs;\nusing Jitter2;\nusing Jitter2.Col"
  },
  {
    "path": "other/WebDemo/Properties/AssemblyInfo.cs",
    "chars": 206,
    "preview": "// Licensed to the .NET Foundation under one or more agreements.\n// The .NET Foundation licenses this file to you under "
  },
  {
    "path": "other/WebDemo/Properties/launchSettings.json",
    "chars": 388,
    "preview": "{\n    \"profiles\": {\n      \"WebDemo\": {\n        \"commandName\": \"Project\",\n        \"launchBrowser\": true,\n        \"environ"
  },
  {
    "path": "other/WebDemo/README.md",
    "chars": 813,
    "preview": "## Jitter2 in the browser\n\n**Credits for raylib-cs in the browser and this README go to: https://github.com/disketteman/"
  },
  {
    "path": "other/WebDemo/RLights.cs",
    "chars": 2620,
    "preview": "using System.Numerics;\nusing Raylib_cs;\nusing static Raylib_cs.Raylib;\n\npublic struct Light\n{\n    public bool Enabled;\n "
  },
  {
    "path": "other/WebDemo/WebDemo.csproj",
    "chars": 1757,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n  <PropertyGroup>\n    <TargetFramework>net9.0</TargetFramework>\n    <RuntimeIdentifier"
  },
  {
    "path": "other/WebDemo/assets/JetBrainsMono-LICENSE.txt",
    "chars": 4399,
    "preview": "Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)\n\nThis Font Software is li"
  },
  {
    "path": "other/WebDemo/assets/lighting.fs",
    "chars": 1911,
    "preview": "#version 100\n\nprecision mediump float;\n\n// Input vertex attributes (from vertex shader)\nvarying vec3 fragPosition;\nvaryi"
  },
  {
    "path": "other/WebDemo/assets/lighting.vs",
    "chars": 1578,
    "preview": "#version 100\n\n// Input vertex attributes\nattribute vec3 vertexPosition;\nattribute vec2 vertexTexCoord;\nattribute vec3 ve"
  },
  {
    "path": "other/WebDemo/index.html",
    "chars": 3505,
    "preview": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <title>Jitter2 WebDemo</title>\n  <meta charset=\"UTF-8\">\n  <meta name=\"viewpor"
  },
  {
    "path": "other/WebDemo/main.js",
    "chars": 3086,
    "preview": "import { dotnet } from './_framework/dotnet.js';\n\nasync function initialize() {\n    const canvas = document.getElementBy"
  },
  {
    "path": "other/WebDemo/run",
    "chars": 198,
    "preview": "#!/bin/bash\n\ndotnet publish -c Release && dotnet serve --mime .wasm=application/wasm --mime .js=text/javascript --mime ."
  },
  {
    "path": "other/WebDemo/runtimeconfig.template.json",
    "chars": 215,
    "preview": "{\n    \"wasmHostProperties\": {\n        \"perHostConfig\": [\n            {\n                \"name\": \"browser\",\n              "
  },
  {
    "path": "src/.gitignore",
    "chars": 64,
    "preview": ".vscode\n.vs\nimgui.ini\n[Bb]in/\n[Oo]bj/\nBenchmarkDotNet.Artifacts\n"
  },
  {
    "path": "src/Jitter2/Attributes.cs",
    "chars": 1944,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/CollisionFilter/IBroadPhaseFilter.cs",
    "chars": 1003,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nnamespace "
  },
  {
    "path": "src/Jitter2/Collision/CollisionFilter/INarrowPhaseFilter.cs",
    "chars": 1411,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/Collision/CollisionFilter/TriangleEdgeCollisionFilter.cs",
    "chars": 9469,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\n// #define"
  },
  {
    "path": "src/Jitter2/Collision/CollisionIsland.cs",
    "chars": 1316,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/DynamicTree/DynamicTree.FindNearest.cs",
    "chars": 12995,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/DynamicTree/DynamicTree.RayCast.cs",
    "chars": 6295,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/DynamicTree/DynamicTree.SweepCast.cs",
    "chars": 16447,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/DynamicTree/DynamicTree.cs",
    "chars": 43337,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/DynamicTree/IDynamicTreeProxy.cs",
    "chars": 5736,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/Collision/DynamicTree/TreeBox.cs",
    "chars": 15580,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/IslandHelper.cs",
    "chars": 9654,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/NarrowPhase/CollisionManifold.cs",
    "chars": 23642,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/NarrowPhase/ConvexPolytope.cs",
    "chars": 13483,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/NarrowPhase/ISupportMappable.cs",
    "chars": 1266,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/Collision/NarrowPhase/MinkowskiDifference.cs",
    "chars": 3918,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/NarrowPhase/NarrowPhase.cs",
    "chars": 53978,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/NarrowPhase/SimplexSolver.cs",
    "chars": 8150,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/NarrowPhase/SimplexSolverAB.cs",
    "chars": 10141,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/NarrowPhase/SupportPrimitives.cs",
    "chars": 5996,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/PairHashSet.cs",
    "chars": 10322,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/BoxShape.cs",
    "chars": 6567,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Sys"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/CapsuleShape.cs",
    "chars": 4545,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/ConeShape.cs",
    "chars": 4314,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/ConvexHullShape.cs",
    "chars": 13464,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/CylinderShape.cs",
    "chars": 4167,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/ICloneableShape.cs",
    "chars": 751,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nnamespace "
  },
  {
    "path": "src/Jitter2/Collision/Shapes/PointCloudShape.cs",
    "chars": 5103,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/RigidBodyShape.cs",
    "chars": 5733,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/Shape.cs",
    "chars": 2867,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jit"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/ShapeHelper.cs",
    "chars": 16090,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/SphereShape.cs",
    "chars": 3144,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/TransformedShape.cs",
    "chars": 5396,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/TriangleMesh.cs",
    "chars": 9894,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/TriangleShape.cs",
    "chars": 6077,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Collision/Shapes/VertexSupportMap.cs",
    "chars": 5172,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/DataStructures/ISink.cs",
    "chars": 1343,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nnamespace "
  },
  {
    "path": "src/Jitter2/DataStructures/PartitionedSet.cs",
    "chars": 9045,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/DataStructures/ReadOnlyHashset.cs",
    "chars": 1395,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/DataStructures/ReadOnlyList.cs",
    "chars": 1007,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/DataStructures/ShardedDictionary.cs",
    "chars": 4050,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/DataStructures/SlimBag.cs",
    "chars": 6688,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/DataStructures/SpanHelper.cs",
    "chars": 2609,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Arbiter.cs",
    "chars": 3327,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/AngularMotor.cs",
    "chars": 6443,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/BallSocket.cs",
    "chars": 8956,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/ConeLimit.cs",
    "chars": 11812,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/Constraint.cs",
    "chars": 13461,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/DistanceLimit.cs",
    "chars": 11958,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/FixedAngle.cs",
    "chars": 6655,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/HingeAngle.cs",
    "chars": 10699,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/Internal/QMatrix.cs",
    "chars": 3626,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/Limit.cs",
    "chars": 3884,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/LinearMotor.cs",
    "chars": 6186,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/PointOnLine.cs",
    "chars": 15318,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/PointOnPlane.cs",
    "chars": 8843,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Constraints/TwistAngle.cs",
    "chars": 9352,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Contact.cs",
    "chars": 49695,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\n\nusing Sys"
  },
  {
    "path": "src/Jitter2/Dynamics/Joints/HingeJoint.cs",
    "chars": 1611,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Joints/Joint.cs",
    "chars": 2112,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Dynamics/Joints/PrismaticJoint.cs",
    "chars": 1966,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/Dynamics/Joints/UniversalJoint.cs",
    "chars": 1438,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/Dynamics/Joints/WeldJoint.cs",
    "chars": 1135,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/Dynamics/RigidBody.cs",
    "chars": 52070,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/IDebugDrawer.cs",
    "chars": 1511,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/Jitter2.csproj",
    "chars": 2598,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n  <PropertyGroup>\n    <TargetFrameworks>net8.0;net9.0;net10.0</TargetFrameworks>\n    "
  },
  {
    "path": "src/Jitter2/LinearMath/Interop.cs",
    "chars": 5705,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/LinearMath/JAngle.cs",
    "chars": 2979,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/LinearMath/JBoundingBox.cs",
    "chars": 15376,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/LinearMath/JMatrix.cs",
    "chars": 25586,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/LinearMath/JQuaternion.cs",
    "chars": 29062,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/LinearMath/JTriangle.cs",
    "chars": 7802,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/LinearMath/JVector.cs",
    "chars": 26204,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/LinearMath/MathHelper.cs",
    "chars": 10269,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/LinearMath/StableMath.cs",
    "chars": 11284,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Logger.cs",
    "chars": 4269,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Parallelization/Parallel.cs",
    "chars": 3870,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Parallelization/ParallelExtensions.cs",
    "chars": 5722,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Parallelization/ReaderWriterLock.cs",
    "chars": 2135,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Parallelization/ThreadPool.cs",
    "chars": 11834,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Precision.cs",
    "chars": 2371,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\n// Uncomm"
  },
  {
    "path": "src/Jitter2/SoftBodies/BroadPhaseCollisionFilter.cs",
    "chars": 3099,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/SoftBodies/DynamicTreeCollisionFilter.cs",
    "chars": 1298,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/SoftBodies/SoftBody.cs",
    "chars": 3381,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/SoftBodies/SoftBodyShape.cs",
    "chars": 1956,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/SoftBodies/SoftBodyTetrahedron.cs",
    "chars": 3230,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/SoftBodies/SoftBodyTriangle.cs",
    "chars": 3538,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Jitt"
  },
  {
    "path": "src/Jitter2/SoftBodies/SpringConstraint.cs",
    "chars": 10624,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Tracer.cs",
    "chars": 12686,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\n/*\n * This"
  },
  {
    "path": "src/Jitter2/Unmanaged/MemoryHelper.cs",
    "chars": 6946,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/Unmanaged/PartitionedBuffer.cs",
    "chars": 15343,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/World.Detect.cs",
    "chars": 17604,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/World.Deterministic.cs",
    "chars": 13657,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/World.Step.cs",
    "chars": 42988,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/World.cs",
    "chars": 25322,
    "preview": "/*\n * Jitter2 Physics Library\n * (c) Thorben Linneweber and contributors\n * SPDX-License-Identifier: MIT\n */\n\nusing Syst"
  },
  {
    "path": "src/Jitter2/_package/LICENSE",
    "chars": 1086,
    "preview": "MIT License\n\nCopyright (c) Thorben Linneweber and contributors\n\nPermission is hereby granted, free of charge, to any per"
  },
  {
    "path": "src/Jitter2/_package/README.md",
    "chars": 99,
    "preview": "Fast, simple, and dependency-free physics engine written in C# with a clear and user-friendly API. "
  },
  {
    "path": "src/Jitter2/_package/THIRD-PARTY-NOTICES.txt",
    "chars": 3968,
    "preview": "Jitter2 Third-Party Notices\n===========================\n\nThis package includes or derives from the third-party code frag"
  },
  {
    "path": "src/Jitter2.sln",
    "chars": 2787,
    "preview": "\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio Version 17\nVisualStudioVersion = 17.4.3320"
  },
  {
    "path": "src/Jitter2.slnx",
    "chars": 229,
    "preview": "<Solution>\n  <Project Path=\"Jitter2\\Jitter2.csproj\" />\n  <Project Path=\"JitterBenchmark\\JitterBenchmark.csproj\" />\n  <P"
  },
  {
    "path": "src/JitterBenchmark/JitterBenchmark.csproj",
    "chars": 536,
    "preview": "<Project Sdk=\"Microsoft.NET.Sdk\">\n\n    <PropertyGroup>\n        <OutputType>Exe</OutputType>\n        <ImplicitUsings>enab"
  },
  {
    "path": "src/JitterBenchmark/Program.cs",
    "chars": 948,
    "preview": "using BenchmarkDotNet.Attributes;\nusing BenchmarkDotNet.Running;\nusing BenchmarkDotNet.Jobs;\nusing JitterTests;\nusing T"
  },
  {
    "path": "src/JitterBenchmark/Usings.cs",
    "chars": 335,
    "preview": "global using Jitter2;\nglobal using Jitter2.Collision;\nglobal using Jitter2.Dynamics;\nglobal using Jitter2.LinearMath;\ngl"
  },
  {
    "path": "src/JitterDemo/ColorGenerator.cs",
    "chars": 911,
    "preview": "using System;\nusing JitterDemo.Renderer.OpenGL;\n\nnamespace JitterDemo;\n\npublic static class ColorGenerator\n{\n    private"
  },
  {
    "path": "src/JitterDemo/Conversion.cs",
    "chars": 1590,
    "preview": "using System.Runtime.CompilerServices;\nusing Jitter2.Dynamics;\nusing Jitter2.LinearMath;\nusing JitterDemo.Renderer.OpenG"
  },
  {
    "path": "src/JitterDemo/ConvexDecomposition.cs",
    "chars": 2572,
    "preview": "using System.Collections.Generic;\nusing Jitter2;\nusing Jitter2.Collision;\nusing Jitter2.Collision.Shapes;\nusing Jitter2."
  },
  {
    "path": "src/JitterDemo/Demos/Car/ConstraintCar.cs",
    "chars": 5696,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Jitter2;\nusing Jitter2.Collision.Shapes;\nusing Jitter2.Dynamics;\nu"
  },
  {
    "path": "src/JitterDemo/Demos/Car/RayCastCar.cs",
    "chars": 6857,
    "preview": "// NOTE: The ray cast car demo is a copied and slightly modified version\n//       of the vehicle example from the great "
  },
  {
    "path": "src/JitterDemo/Demos/Car/Wheel.cs",
    "chars": 12466,
    "preview": "// NOTE: The ray cast car demo is a copied and slightly modified version\n//       of the vehicle example from the great "
  },
  {
    "path": "src/JitterDemo/Demos/Common.cs",
    "chars": 12443,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Jitter2;\nusing Jitter2.Collision;\nusing Jitter2.Collision.Shapes;\n"
  },
  {
    "path": "src/JitterDemo/Demos/Demo00.cs",
    "chars": 1152,
    "preview": "using System.IO;\nusing Jitter2;\nusing Jitter2.LinearMath;\nusing JitterDemo.Renderer;\n\nnamespace JitterDemo;\n\npublic clas"
  },
  {
    "path": "src/JitterDemo/Demos/Demo01.cs",
    "chars": 2846,
    "preview": "using System;\nusing System.Collections.Generic;\nusing Jitter2;\nusing Jitter2.Collision.Shapes;\nusing Jitter2.Dynamics;\nu"
  },
  {
    "path": "src/JitterDemo/Demos/Demo02.cs",
    "chars": 434,
    "preview": "using Jitter2;\nusing Jitter2.LinearMath;\nusing JitterDemo.Renderer;\n\nnamespace JitterDemo;\n\npublic class Demo02 : IDemo\n"
  },
  {
    "path": "src/JitterDemo/Demos/Demo03.cs",
    "chars": 505,
    "preview": "using Jitter2;\nusing Jitter2.LinearMath;\nusing JitterDemo.Renderer;\n\nnamespace JitterDemo;\n\npublic class Demo03 : IDemo\n"
  },
  {
    "path": "src/JitterDemo/Demos/Demo04.cs",
    "chars": 563,
    "preview": "using Jitter2;\nusing Jitter2.LinearMath;\nusing JitterDemo.Renderer;\nusing static JitterDemo.Common;\n\nnamespace JitterDem"
  },
  {
    "path": "src/JitterDemo/Demos/Demo05.cs",
    "chars": 3324,
    "preview": "using System.Collections.Generic;\nusing System.Linq;\nusing System.Runtime.InteropServices;\nusing Jitter2;\nusing Jitter2."
  },
  {
    "path": "src/JitterDemo/Demos/Demo06.cs",
    "chars": 4976,
    "preview": "using System;\nusing System.IO;\nusing Jitter2;\nusing Jitter2.LinearMath;\nusing JitterDemo.Renderer;\nusing JitterDemo.Rend"
  }
]

// ... and 183 more files (download for full content)

About this extraction

This page contains the full source code of the notgiven688/jitterphysics2 GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 383 files (6.2 MB), approximately 1.6M tokens, and a symbol index with 4233 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!